LOG4J Apache日志框架笔记
一 简单使用
1 maven依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2 快速使用
- 代码
@Test
public void test01(){
// 获取日志记录器对象
Logger logger = Logger.getLogger(Log4jTest.class);
// 输出日志
logger.fatal("fatal");
logger.error("error");
logger.warn("warn");
logger.info("info");
logger.debug("debug");
logger.trace("trace");
}
- 运行结果
log4j:WARN No appenders could be found for logger (com.salulu.logger.test.Log4jTest).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Process finished with exit code 0
发现有三条警告信息,并没有输出在代码中写的日志信息。
从警告信息中可以看出:没有设置appender对象
- 解决上述问题
在代码中初始化配置信息
@Test
public void test01(){
// 获取日志记录器对象
Logger logger = Logger.getLogger(Log4jTest.class);
// 初始化默认的配置信息
BasicConfigurator.configure();
// 输出日志
logger.fatal("fatal");
logger.error("error");
logger.warn("warn");
logger.info("info");
logger.debug("debug");
logger.trace("trace");
}
输出结果:
0 [main] FATAL com.salulu.logger.test.Log4jTest - fatal
1 [main] ERROR com.salulu.logger.test.Log4jTest - error
1 [main] WARN com.salulu.logger.test.Log4jTest - warn
1 [main] INFO com.salulu.logger.test.Log4jTest - info
1 [main] DEBUG com.salulu.logger.test.Log4jTest - debug
可以看到警告信息没有了,日志正常输出了,默认只输出到debug级别的日志信息。
二 日志级别
级别 | 描述 |
---|---|
fatal | 严重错误,一般会造成系统崩溃并终止运行 |
error | 错误信息,不会影响系统运行 |
warn | 警告信息,可能会发生问题 |
info | 运行信息 |
debug | 调试信息,一般在开发中使用,记录程序变量参数传递信息等等 |
trace | 追踪信息,记录程序所有的流程信息 |
三 配置文件
1 配置文件放哪里
查看LogManager源码,可以看到log4j支持多种格式的配置文件,其中log4j.properties的格式最为简单配置。
在LogManager源码,读取配置文件:
url = Loader.getResource("log4j.properties");
使用Loader来读取,在Loader用ClassLoader来读取resources文件夹下的文件
所以只需要把log4j.properties配置文件放到resources文件夹下即可被log4j读取到。
2 简单的配置
2.1 配置内容
# 指定 RootLogger 顶级父元素默认配置信息
log4j.rootLogger = trace,console
# 指定控制台日志输出的 appender
log4j.appender.console = org.apache.log4j.ConsoleAppender
# 指定消息格式 layout
log4j.appender.console.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.console.layout.conversionPattern = %d{yyyy-MM-dd HH:mm:ss.SSS} - %-4r %-5p [%t] %C:%L %x - %m%n
把log4j.properties文件放入到resources文件夹下
2.2 测试
代码:
@Test
public void test01(){
// 获取日志记录器对象
Logger logger = Logger.getLogger(Log4jTest.class);
// 日志级别
logger.fatal("fatal");
logger.error("error");
logger.warn("warn");
logger.info("info");
logger.debug("debug");
logger.trace("trace");
}
运行结果:
2020-10-01 12:57:42.708 - 0 FATAL [main] com.salulu.logger.test.Log4jTest:15 - fatal
2020-10-01 12:57:42.710 - 2 ERROR [main] com.salulu.logger.test.Log4jTest:16 - error
2020-10-01 12:57:42.710 - 2 WARN [main] com.salulu.logger.test.Log4jTest:17 - warn
2020-10-01 12:57:42.711 - 3 INFO [main] com.salulu.logger.test.Log4jTest:18 - info
2020-10-01 12:57:42.711 - 3 DEBUG [main] com.salulu.logger.test.Log4jTest:19 - debug
2020-10-01 12:57:42.711 - 3 TRACE [main] com.salulu.logger.test.Log4jTest:20 - trace
3 配置详解
3.1 日志输入位置配置
log4j支持把日志输出到控制台、文件、数据库中。
在log4j.rootLogger配置中,可以指定一个或多个输出的位置
例如把日志同时输出到控制台和文件中(同时指定日志级别为TRACE):
log4j.rootLogger = trace,console,file
3.2 日志输入格式配置
%m 输出代码中指定的日志信息
%p 输出优先级,及 DEBUG、INFO 等
%n 换行符(Windows平台的换行符为 "\n",Unix 平台为 "\n")
%r 输出自应用启动到输出该 log 信息耗费的毫秒数
%c 输出打印语句所属的类的全名
%t 输出产生该日志的线程全名
%d 输出服务器当前时间,默认为 ISO8601,也可以指定格式,如:%d{yyyy年MM月dd日 HH:mm:ss}
%l 输出日志时间发生的位置,包括类名、线程、及在代码中的行数。如:Test.main(Test.java:10)
%F 输出日志消息产生时所在的文件名称
%L 输出代码中的行号
%% 输出一个 "%" 字符
例如:
log4j.appender.console.layout.conversionPattern = %d{yyyy-MM-dd HH:mm:ss.SSS} - %-4r %-5p [%t] %C:%L %x - %m%n
效果就是上面2.2测试中的输出结果
3.3 日志输出到文件的策略
日志可以不切割,默认是追加的方式,但在实际使用中一般都是需要对日志文件进行切割的。
可以按照日志文件的大小切割,或者按照时间规则来切割。
- 追加的方式,不进行切割
指定appender为file
log4j.appender.file = org.apache.log4j.FileAppender
- 按照大小切割:
指定appender为rollingFile
log4j.appender.rollingFile = org.apache.log4j.RollingFileAppender
- 按照时间格式切割:
指定appender为dailyFile
log4j.appender.dailyFile = org.apache.log4j.DailyRollingFileAppender
具体的配置后面会有示例。
3.4 日志输出级别
log4j.rootLogger = trace,console,file
在log4j.rootLogger中可以同时配置日志输出级别和输出位置
3.5 自定义配置
log4j.rootLogger这个是顶级父元素的配置,如果是需要对特定的包做配置可以单独指定。
例如:
log4j.logger.com.xxx.xxx = info,console
指定com.xxx.xxx包下的日志级别为info,同时只输出到控制台。
四 配置示例
1 输出到控制台
# 指定日志级别=debug并输出到控制台
log4j.rootLogger = debug,console
# 指定控制台日志输出的 appender
log4j.appender.console = org.apache.log4j.ConsoleAppender
# 指定消息格式 layout
log4j.appender.console.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.console.layout.conversionPattern = [%-10p]%r %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
2 输出到文件
2.1 不切割文件
# 指定日志级别为debug,输出日志到文件
log4j.rootLogger = debug,file
# 日志文件输出的 appender 对象
log4j.appender.file = org.apache.log4j.FileAppender
# 指定消息格式 layout
log4j.appender.file.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.file.layout.conversionPattern = [%-10p]%r %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
# 指定日志文件保存路径
log4j.appender.file.file = /xxx/xxx.log
# 指定日志文件的字符集
log4j.appender.file.encoding = UTF-8
2.2 按文件大小切割
# 指定日志级别为debug,输出日志到文件
log4j.rootLogger = debug,rollingFile
# 按照文件大小拆分的 appender 对象
# 日志文件输出的 appender 对象
log4j.appender.rollingFile = org.apache.log4j.RollingFileAppender
# 指定消息格式 layout
log4j.appender.rollingFile.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.rollingFile.layout.conversionPattern = [%-10p]%r %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
# 指定日志文件保存路径
log4j.appender.rollingFile.file = /xxx/xxx.log
# 指定日志文件的字符集
log4j.appender.rollingFile.encoding = UTF-8
# 指定日志文件内容的大小
log4j.appender.rollingFile.maxFileSize = 1MB
# 指定日志文件的数量
log4j.appender.rollingFile.maxBackupIndex = 10
上面配置了每个日志大小为1MB,共10个文件,如果文件被写满,新日志信息则会覆盖最老的日志。
2.3 按时间规则切割
# 指定日志级别为debug,输出日志到文件
log4j.rootLogger = debug,dailyFile
# 按照时间规则拆分的 appender 对象
log4j.appender.dailyFile = org.apache.log4j.DailyRollingFileAppender
# 指定消息格式 layout
log4j.appender.dailyFile.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.dailyFile.layout.conversionPattern = [%-10p]%r %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
# 指定日志文件保存路径
log4j.appender.dailyFile.file = /xxx/xxx.log
# 指定日志文件的字符集
log4j.appender.dailyFile.encoding = UTF-8
# 指定日期拆分规则
log4j.appender.dailyFile.datePattern = '.'yyyy-MM-dd
datePattern值中的点’.'表示在xxx.log后面追加的信息
当前就是xxx.log.2020-10-01
还可以按照小时切割:log4j.appender.dailyFile.datePattern = '.'yyyy-MM-dd-HH
按照分钟切割:log4j.appender.dailyFile.datePattern = '.'yyyy-MM-dd-HH-mm
按秒切割:log4j.appender.dailyFile.datePattern = '.'yyyy-MM-dd-HH-ss
3 输出到数据库
# 指定日志级别为debug,输出日志到数据库
log4j.rootLogger = debug,logDB
#mysql
log4j.appender.logDB=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.logDB.layout=org.apache.log4j.PatternLayout
# 数据库驱动
log4j.appender.logDB.Driver=com.mysql.jdbc.Driver
# 数据库地址
log4j.appender.logDB.URL=jdbc:mysql://localhost:3306/test
# 数据库账号
log4j.appender.logDB.User=root
# 数据库密码
log4j.appender.logDB.Password=root
# 日志插入语句
log4j.appender.logDB.Sql=INSERT INTO log(project_name,create_date,level,category,file_name,thread_name,line,all_category,message) values('test','%d{yyyy-MM-dd HH:mm:ss}','%p','%c','%F','%t','%L','%l','%m')
需要先到数据库中把表给建好即可。
4 同时输出到多个地方
# 指定日志级别为info,输出日志到控制台、文件和数据库
log4j.rootLogger = debug,console,rollingFile,logDB
# 自定义 com.xxx.xxx包下的日志设置
log4j.logger.com.xxx.xxx = info,console,logDB
注意把每个appender都配置好才可以使用。