日志框架之LOG4J

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 日志框架之LOG4J,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

LOG4J

Log4j是Apache下的一款开源的日志框架,使用 Log4J,可以控制日志信息输出到控制台、文件、甚至是数据库中。也可以控制每一条日志的输出格式,通过定义日志的输出级别,可以更灵活的控制日志的输出过程以及方便项目的调试。

LOG4J的构成

Log4J主要由 Loggers (日志记录器)、Appenders(输出端)和 Layout(日志格式化器)组成。

Loggers控制日志的输出级别与日志是否输出

Appenders 指定日志的输出方式(输出到控制台、文件等)

Layout 控制日志信息的输出格式

Loggers

日志记录器,负责收集处理日志记录,实例的命名就是类的全限定名

Logger的名字大小写敏感,其命名有继承机制:如:name为org.apache.commons的logger会继承name为org.apache的logger。

Log4J中有一个特殊的logger叫做“root”,是所有logger的根,其他所有的logger都会直接或者间接地继承自root。root logger可以用Logger.getRootLogger()方法获取。

Appenders

Appender用来指定日志输出的目的地,可以同时指定日志的输出目的地。

常用输出目的地:

ConsoleAppender 将日志输出到控制台

FileAppender 将日志输出到文件中

DailyRollingFileAppender 将日志输出到一个日志文件,并且每天输出到一个新的文件

RollingFileAppender 将日志信息输出到一个日志文件,并且指定文件的尺寸,当文件大小达到指定尺寸时,会自动把文件改名,同时产生一个新的文件

JDBCAppender 把日志信息保存到数据库中

Layouts

布局器 , Layouts用于控制日志输出内容的格式,可以使用各种需要的格式输出日志。

常用的Layouts

HTMLLayout 格式化日志输出为HTML表格形式

.xml.XMLLayout  格式化日志输出为XML形式

SimpleLayout 简单的日志输出格式化,打印的日志格式为(info - message)

PatternLayout最强大的格式化期,可以根据自定义格式输出日志,如果没有指定转换格式,就是用默认的转换格式

LOG4J的使用

引入依赖

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

使用类默认配置

直接使用不指定log4j相关配置

    @Test
    public void test() {
        //获取日志记录器对象
        Logger logger = Logger.getLogger(Log4j.class);
        //日志记录输出
        logger.info("hello log4j");
    }

由于没有指定log4j的相关配置出现警告,日志无法正常使用

log4j:WARN No appenders could be found for logger (cn.ybzy.Log4j).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

指定类初始化log4j的相关配置

    @Test
    public void test() {

        //不使用配置文件,类初始化默认配置信息
        BasicConfigurator.configure();

        //获取日志记录器对象
        Logger logger = Logger.getLogger(Log4j.class);
        //日志记录输出
        logger.info("hello log4j");
    }
0 [main] INFO cn.ybzy.Log4j  - hello log4j

使用log4j配置文件

log4j.properties

#指定日志级别:trace 使用的appender为console (自定义appender名称console)
log4j.rootLogger=trace,console

#指定控制台日志输出的ConsoleAppender
log4j.appender.console=org.apache.log4j.ConsoleAppender
#指定日志输出的格式
log4j.appender.console.layout=org.apache.log4j.SimpleLayout

log4j会到resources资源目录加载log4j.properties配置文件

    @Test
    public void test() {
        Logger logger = Logger.getLogger(Log4j.class);

        logger.info("hello log4j");
}
INFO - hello log4j

自定义Logger

#指定日志的输出级别与输出端
log4j.rootLogger=trace

# 自定义logger对象设置
log4j.logger.cn.ybzy = warn,console

#指定控制台日志输出的ConsoleAppender
log4j.appender.console=org.apache.log4j.ConsoleAppender
#指定Layouts日志格式为PatternLayout
log4j.appender.console.layout=org.apache.log4j.SimpleLayout
    @Test
    public void test() {
        Logger logger = Logger.getLogger(Log4j.class);

        logger.fatal("fatal");
        logger.error("error");
        logger.warn("warn");
        logger.info("info");
        logger.debug("debug");
        logger.trace("trace");
        }
FATAL - fatal
ERROR - error
WARN - warn

log4j内置日志记录

    @Test
    public void test() {
        //开启log4j内置日志记录
        LogLog.setInternalDebugging(true);

        Logger logger = Logger.getLogger(Log4j.class);
        logger.info("hello log4j");
}
log4j: Trying to find [log4j.xml] using context classloader sun.misc.Launcher$AppClassLoader@18b4aac2.
log4j: Trying to find [log4j.xml] using sun.misc.Launcher$AppClassLoader@18b4aac2 class loader.
log4j: Trying to find [log4j.xml] using ClassLoader.getSystemResource().
log4j: Trying to find [log4j.properties] using context classloader sun.misc.Launcher$AppClassLoader@18b4aac2.
log4j: Using URL [file:/C:/Users/JackChen/Desktop/%e4%bb%a3%e7%a0%81/log4j_demo/target/classes/log4j.properties] for automatic log4j configuration.
log4j: Reading configuration from URL file:/C:/Users/JackChen/Desktop/%e4%bb%a3%e7%a0%81/log4j_demo/target/classes/log4j.properties
log4j: Parsing for [root] with value=[trace,console].
log4j: Level token is [trace].
log4j: Category root set to TRACE
log4j: Parsing appender named "console".
log4j: Parsing layout options for "console".
log4j: End of parsing for "console".
log4j: Parsed "console" options.
log4j: Finished configuring.
INFO - hello log4j

LOG4J的日志级别

日志级别从高到低:

fatal 指出每个严重的错误事件将会导致应用程序的退出。

error 指出虽然发生错误事件,但仍然不影响系统的继续运行。

warn 表明会出现潜在的错误情形。

info 一般和在粗粒度级别上,强调应用程序的运行全程。

debug 一般用于细粒度级别上,对调试应用程序非常有帮助。

trace 是程序追踪,可以用于输出程序运行中的变量,显示执行的流程。

两个特殊级别:

OFF 可用来关闭日志记录。

ALL  启用所有消息的日志记录。
    @Test
    public void test() {

       //不使用配置文件,类初始化默认配置信息
        BasicConfigurator.configure();

        //获取日志记录器对象
        Logger logger = Logger.getLogger(Log4j.class);
        
        /**
         * 日志级别
         * 默认日志级别:debug
         *
         * fatal: 严重错误,一般会造成系统崩溃并终止运行
         * error: 错误信息,不会影响系统运行
         * warn: 警告信息,可能会发生问题
         * info: 运行信息,数据连接、网络连接、IO操作等
         * debug: 调试信息,一般在开发中使用,记录程序变量参数传递信息等
         * trace: 追踪信息,记录程序所有的流程信息
         */
        logger.fatal("fatal");
        logger.error("error");
        logger.warn("warn");
        logger.info("info");
        logger.debug("debug");
        logger.trace("trace");
    }
0 [main] FATAL cn.ybzy.Log4j  - fatal
2 [main] ERROR cn.ybzy.Log4j  - error
2 [main] WARN cn.ybzy.Log4j  - warn
2 [main] INFO cn.ybzy.Log4j  - info
2 [main] DEBUG cn.ybzy.Log4j  - debug

Layout的格式化

格式化日志信息,具体占位符及其含义:

%m 输出代码中指定的日志信息

%p 输出优先级,及 DEBUG、INFO 等

%n 换行符

%r 输出自应用启动到输出该 log 信息耗费的毫秒数

%c 输出打印语句所属的类的全名

%t 输出产生该日志的线程全名

%d 输出服务器当前时间,默认为 ISO8601,也可以指定格式,如:%d{yyyy-MM-dd-HH:mm:ss}

%l 输出日志时间发生的位置,包括类名、线程、及在代码中的行数。如:cn.ybzy.Log4j.test(Log4j.java:16)

%F 输出日志消息产生时所在的文件名称

%L 输出代码中的行号

%% 输出一个 "%" 字符

在 % 与字符之间加上修饰符来控制最小宽度、最大宽度和文本的对其方式

%5c 输出category名称,最小宽度是5,category<5,默认的情况下右对齐
	
%-5c 输出category名称,最小宽度是5,category<5"-"号指定左对齐,会有空格
	
%.5c 输出category名称,最大宽度是5,category>5,就会将左边多出的字符截掉,<5不会有空格
	
%20.30c category名称<20补空格,并且右对齐,>30字符,就从左边交远销出的字符截掉

测试

#指定日志的输出级别与输出端
log4j.rootLogger=trace,console1

#指定控制台日志输出的ConsoleAppender
log4j.appender.console1=org.apache.log4j.ConsoleAppender

#指定Layouts日志格式为PatternLayout
log4j.appender.console1.layout=org.apache.log4j.PatternLayout
#指定日志内容的格式
log4j.appender.console1.layout.ConversionPattern=[%t] %-5p %d %l - %m%n
[main] INFO  2021-03-21 11:58:36,487 cn.ybzy.Log4j.test(Log4j.java:16) - hello log4j

Appender的输出

控制台的输出

#指定日志的输出级别与输出端
log4j.rootLogger=trace,console1

#指定控制台日志输出的ConsoleAppender
log4j.appender.console1=org.apache.log4j.ConsoleAppender

#指定Layouts日志格式为PatternLayout
log4j.appender.console1.layout=org.apache.log4j.PatternLayout
#指定日志内容的格式
log4j.appender.console1.layout.ConversionPattern=[%t] %-5p %d %l - %m%n

文件的输出

普通的文件输出

#指定日志的输出级别与输出端
log4j.rootLogger=trace,file

# 日志文件输出的FileAppender对象
log4j.appender.file = org.apache.log4j.FileAppender
# 指定消息格式 layout
log4j.appender.file.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.file.layout.conversionPattern = [%-6p]%r  %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
# 指定日志文件保存路径
log4j.appender.file.file = d:/log4j.log
# 指定日志文件的字符集
log4j.appender.file.encoding = UTF-8

在这里插入图片描述

按照文件大小拆分

#指定日志的输出级别与输出端
log4j.rootLogger=trace,rollingFile

# 按照文件大小拆分的RollingFileAppender对象
log4j.appender.rollingFile = org.apache.log4j.RollingFileAppender
# 指定消息格式 layout
log4j.appender.rollingFile.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.rollingFile.layout.conversionPattern = [%p]%r  %l %d{yyyy-MM-dd HH:mm:ss} %m%n
# 指定日志文件保存路径
log4j.appender.rollingFile.file = d:/log4j.log
# 指定日志文件的字符集
log4j.appender.rollingFile.encoding = UTF-8
# 指定日志文件内容的大小
log4j.appender.rollingFile.maxFileSize = 1MB 
# 指定日志文件的数量
log4j.appender.rollingFile.maxBackupIndex = 10

在这里插入图片描述

按照时间规则拆分

#指定日志的输出级别与输出端
log4j.rootLogger=trace,dailyFile


# 按照时间规则拆分的DailyRollingFileAppender对象
log4j.appender.dailyFile = org.apache.log4j.DailyRollingFileAppender
# 指定消息格式 layout
log4j.appender.dailyFile.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.dailyFile.layout.conversionPattern = [%t] %-5p %d %l - %m%n
# 指定日志文件保存路径
log4j.appender.dailyFile.file = d:/log4j.log
# 指定日志文件的字符集
log4j.appender.dailyFile.encoding = UTF-8
# 指定日期拆分规则
log4j.appender.dailyFile.datePattern = '.'yyyy-MM-dd-HH-mm-ss

在这里插入图片描述

数据库的输出

创建表

CREATE TABLE `log` (
`log_id` int(11) NOT NULL AUTO_INCREMENT,
`create_date` varchar(255) DEFAULT NULL COMMENT '创建时间',
`level` varchar(255) DEFAULT NULL COMMENT '优先级',
`category` varchar(255) DEFAULT NULL COMMENT '所在类的全名',
`file_name` varchar(255) DEFAULT NULL COMMENT '输出日志消息产生时所在的文件名称 ',
`thread_name` varchar(255) DEFAULT NULL COMMENT '日志事件的线程名',
`line` varchar(255) DEFAULT NULL COMMENT '号行',
`all_category` varchar(255) DEFAULT NULL COMMENT '日志事件的发生位置',
`message` varchar(4000) DEFAULT NULL COMMENT '输出代码中指定的消息',
PRIMARY KEY (`log_id`)
);

配置log4j.properties

#指定日志的输出级别与输出端
log4j.rootLogger=trace,saveDB

log4j.appender.saveDB=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.saveDB.layout=org.apache.log4j.PatternLayout
log4j.appender.saveDB.Driver=com.mysql.jdbc.Driver
log4j.appender.saveDB.URL=jdbc:mysql://localhost:3306/demo
log4j.appender.saveDB.User=root
log4j.appender.saveDB.Password=123456
log4j.appender.saveDB.Sql=INSERT INTO log(create_date,level,category,file_name,thread_name,line,all_category,message) values('%d{yyyy-MM-dd HH:mm:ss}','%p','%c','%F','%t','%L','%l','%m')

执行测试后查看
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/137069.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!