日志级别
TRACE
比debug粒度更细
DEBUG
允许输出调试应用程序的信息
INFO
粗粒度级别突出应用程序进度的信息
WARN
输出程序潜在有害的信息
ERROR
遇到并输出错误信息,但仍然允许应用程序继续运行
FATAL
可能导致程序中止的非常严重的错误信息
OFF
级别最高,关闭日志记录
ALL
最低级别,打开所有日志记录
优先级
日志级别从低到高顺序为:TRACE < DEBUG < INFO < WARN < ERROR < FATAL
常用级别为DEBUG,INFO,WARN,ERROR
常用配置
配置文件位置
放在程序classpath路径下即可。
例如maven项目放在src/main/java/log4j.properties
输出到控制台
log4j.rootLogger=INFO,console
#console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p] %c{2} - %m%n
配置文件解读
1、声明根日志记录器,这个是必须的
log4j.rootLogger=INFO,console
声明根记录器,定义程序输出的所有日志级别最低
为INFO
级别(级别不低于 INFO 的所有日志都可以输出),输出日志目的地名字叫做console
,这个名字可以随便写。
2、设置记录器将日志输出到哪里
log4j.appender.console=org.apache.log4j.ConsoleAppender
设置日志输出目的地 console
是一个控制台。
3、设置记录器以什么格式输出日志
log4j.appender.console.layout=org.apache.log4j.PatternLayout
设置目的地console
日志输出格式,是简配版的还是豪华版的,或者是自定义格式。这里设置的是自定义格式。
4、设置记录器输出格式
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p] %c{2} - %m%n
自定义的日志输出格式。
例如:
%d{yyyy-MM-dd HH:mm:ss} [%p] %c{2} - %m%n
输出的格式为:
2022-01-06 10:40:49 [INFO] log4j.TestLog4j - i=4
%d 表示输出时间,后面将日志格式化指定的形式输出。
%p 表示输出日志级别。
%c 表示输出类的完整包路径,{2}表示只显示包括类名的最后两级信息。
- 没有任何含义,只是一个输出字符串而已,为了好看。
%m 表示程序要输出的内容
%n 表示换行,Linux和Windows的换行符不同,这个会自动识别。
输出到文件
log4j.rootLogger=INFO,console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p] %c{2} - %m%n
log4j.logger.test.log4j.Test1 = DEBUG, file
log4j.appender.file = org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} [%p] %c{2} - %m%n
log4j.appender.file.file = fileLog.log
log4j.appender.file.datePattern = '.'yyyy-MM-dd-HH-mm
配置文件解读
1、声明子日志记录器,可选
log4j.logger.test.log4j.Test1 = DEBUG, file
声明子
日志记录器test.log4j.Test1
,日志级别定义为DEBUG,日志输出到一个名字叫做file
的地方。
2、设置日志记录器将日志输出到哪里
log4j.appender.file = org.apache.log4j.DailyRollingFileAppender
设置名字叫做file
的地方是一个循环写入文件。
3、设置日志记录器以什么格式输出日志
log4j.appender.file.layout = org.apache.log4j.PatternLayout
设置名字叫做file
的地方采用自定义输出格式。
4、设置具体的自定义输出格式
log4j.appender.file.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} [%p] %c{2} - %m%n
输出格式为:
2022-01-06 14:50:47 [DEBUG] log4j.Test1 - **** test1 DEBUG ****
5、设置具体日志文件名
log4j.appender.file.file = fileLog.log
设置输出的日志文件名(包含路径)。
6、设置以什么命名规律作为循环日志的文件名称
log4j.appender.file.datePattern = '.'yyyy-MM-dd-HH-mm
表示每分钟产生一个日志文件。
当前分钟日志写入到fileLog.log中
下一分钟时,将fileLog.log按设置的命名规律重命名。
例如当前时间是2022-01-06 14:50:47,那么当前日志是写入在fileLog.log中,当时间到2022-01-06 14:51:00时,会将之前的fileLog.log重命名为fileLog.log.2022-01-06-14-50,并重新生成一个新的fileLog.log继续记录当前时间的日志。
日志继承问题
在输出到文件使用了log4j.logger.test.log4j.Test1 = DEBUG, file
表示子记录器test.log4j.Test1
将日志输出到file
中,但是实际上不仅仅只输出到file
,同时也输出到console
中了。
这是因为所有的子记录器都默认继承了根记录器的输出。所以即使子记录器只设置了输出到file
,也会同时输出一份相同内容到console
。
子记录器虽然继承了根记录器的输出设置,但是子记录器同样可以覆盖根记录器,在这里根记录器rootLogger
设置的日志记录级别是INFO,而子记录器test.log4j.Test1
设置的日志记录级别为DEBUG,覆盖了根记录器的日志级别,所以在file
和console
中输出的最低日志级别为DEBUG
由于没有对test.log4j.Test2
设置子记录器,所以采用根记录器输出日志,将日志内容输出到console
控制台,并没有将日志输出到file
中。
取消继承
有时我们只想将日志分开存放,并不想将重复的日志内容重复输出。
子记录器test.log4j.Test1
输出到file
的日志内容,就不要再重复的输出到根记录器console
中了。
可以通过设置子记录器test.log4j.Test1
的addivitity
属性为false
来取消继承。
将file
的配置改为
log4j.logger.test.log4j.Test1 = DEBUG, file
log4j.additivity.test.log4j.Test1 = false
log4j.appender.file = org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} [%p] %c{2} - %m%n log4j.appender.file.file = fileLog.log
log4j.appender.file.datePattern = '.'yyyy-MM-dd-HH-mm
这样子记录器test.log4j.Test1
的内容只输出到file
中,没有重复输出到console
。test.log4j.Test2
由于没有设置子记录器,所以使用根记录器输出到console
中。
抽取高级别日志
子记录器test.log4j.Test1
覆盖了根记录器的日志记录级别,输出了很多的信息。我想从里面抽取出ERROR级别以上的日志内容单独作为一个日志文件fileLogError.log。既不影响原来的fileLog.log,又可以直观的查看错误日志内容。
修改子记录器test.log4j.Test1
的配置
log4j.logger.test.log4j.Test1 = DEBUG, file,
file2
log4j.additivity.test.log4j.Test1 = false
log4j.appender.file = org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} [%p] %c{2} - %m%n
log4j.appender.file.file = fileLog.log
log4j.appender.file.datePattern = '.'yyyy-MM-dd-HH-mm
#log4j.appender.file2 = org.apache.log4j.DailyRollingFileAppender
log4j.appender.file2.threshold = ERROR
log4j.appender.file2.layout = org.apache.log4j.PatternLayout
log4j.appender.file2.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} [%p] %c{2} - %m%n
log4j.appender.file2.file = fileLogError.log
log4j.appender.file2.datePattern = '.'yyyy-MM-dd-HH-mm
添加了目的地file2
,配置和file
相同。file2
添加了threshold
属性配置为ERROR
,表示只有日志级别不低于ERROR的日志内容才会输出,这样就达到了抽取高级别日志的目的。
以上内容编辑于 2022-01-06