Log4J,Apache下的一个开源日志组件框架,目前有1.X和2.X(Log4J2)两个版本,本文将介绍其1.X版本的配置、使用
概述
在使用日志组件之前,更多的是使用System.out.println输出log来调试代码,但是在大型项目运行起来后,该方法存在诸多不便(无法对输出信息分级,序列化,查找不便等等),这时候,而使用日志组件就可以很好的解决该问题
Log4J,是一个广泛应用于Java Web服务中的日志组件实现,配置方便使用简单,其主要有如下三个组件:
- Logger: 获取日志信息
- Appender: 确定日志信息的输出目的地
- Layout: 定义日志信息的输出格式
添加Maven依赖
在 pom.xml 文件中添加 Log4J 的Maven依赖即可
1 | <!-- Log4J --> |
配置文件 log4j.properties
添加Log4J配置文件(log4j.properties),LogManager 会在 classpath 中自动搜索 Log4j.properties 配置文件
定义根日志级别、appender
1 | log4j.rootLogger = level, appendName1, appendName2, ... |
level 为日志记录的级别,从高到低分别为:
off > fatal > error > warn > info > debug > all
log4j 推荐使用的4个级别: error, warn, info, debug。日志记录器会记录输出不低于设定级别的日志信息。
例如,使用warn级别后,将只会记录输出warn、error、fatal级别的日志信息
Example:1
2# 定义根日志记录的级别为info, 定义3个appender()并分别命名为:out, file1, file2
log4j.rootLogger = info, out, file1, file2, file3
配置 Appender
配置输出目的地 log4j.appender.out, Log4J的提供的appender有:
- org.apache.log4j.ConsoleAppender : 控制台输出器
- org.apache.log4j.FileAppender : 日志文件输出器
- org.apache.log4j.DailyRollingFileAppender : 日志文件输出器,按天存储
- org.apache.log4j.RollingFileAppender : 日志文件输出器,按日志文件大小分割存储
Example:1
2
3
4
5
6
7
8# 名为 out 的 appender 使用控制台输出
log4j.appender.out = org.apache.log4j.ConsoleAppender
# 名为 file1 的 appender 使用日志文件储存
log4j.appender.file1 = org.apache.log4j.FileAppender
# 名为 file2 的 appender 使用日志文件按天存储
log4j.appender.file2 = org.apache.log4j.DailyRollingFileAppender
# 名为 file3 的 appender 使用日志文件按文件大小存储
log4j.appender.file3 = org.apache.log4j.RollingFileAppender
- ConsoleAppender
控制台输出器常用配置如下,其中threshold属性为该appender的日志级别,即控制台将只输出error级别的日志信息1
2
3# target属性可以不配置
log4j.appender.out.target = System.out
log4j.appender.out.threshold = error
Note:
- appender的threshold设定级别不低于根日志(rootLogger)的级别时,才会生效;如果低于根日志(rootLogger)的级别,该值将会被忽略,即该appender使用根日志(rootLogger)的级别
- appender的threshold属性可以不配置,即该appender使用根日志(rootLogger)的级别
- FileAppender
日志文件输出器常用配置如下:1
2
3
4
5
6log4j.appender.file1 = org.apache.log4j.FileAppender
# 指定日志文件路径
log4j.appender.file1.File = /Users/zgh/log/log1.log
log4j.appender.file1.threshold = warn
# 服务启动后,产生的日志信息是否追加到日志文件中,默认为true;配置为false,原日志文件将被清空
log4j.appender.file1.append = false
- DailyRollingFileAppender
日志文件输出器(按天存储)常用配置如下:
1 | log4j.appender.file2 = org.apache.log4j.DailyRollingFileAppender |
Note:
- 需要注意的是,该输出器在会先生成一个log2的日志文件并向其中写入的当天(令日期为8.10)日志信息,在第二天时(8.11日),才会将log2文件重命名为log2.2019-08-10.log,同时重新生成一个新的log2文件用于写入当天的日志。所以,查看日志时,是找不到包含当天日期文件名的日志文件
- RollingFileAppender
日志文件输出器(按文件大小存储)常用配置如下:
1 | log4j.appender.file3 = org.apache.log4j.RollingFileAppender |
当当前的日志文件log3.log大小达到设定的最大值2KB时,该日志文件将重命名为log3.log.1备份日志文件,同时重新生成一个新的日志文件log3.log来继续写入日志;当日志文件又一次达到最大值2KB时,会先log3.log.1备份日志文件重命名为log3.log.2,然后再将log3.log日志文件重命名为log3.log.1备份日志文件,同时又生成一个新的日志文件log3.log来继续写入日志……该过程将一直循环继续下去,其中备份日志文件的数目由MaxFileSize指定,上文配置为3,则,将会保留离当前时刻最近3个备份日志文件,其中logfilename.1备份日志文件为距离当前时刻最近的日志记录,logfilename.3备份日志文件为距离当前时刻最远的日志记录
配置 Layout
Layout用于指定Appender的输出格式,Log4J提供以下几种Layout
- org.apache.log4j.HTMLLayout : 使用HTML表格形式布局
- org.apache.log4j.PatternLayout : 可以灵活地指定布局模式
- org.apache.log4j.SimpleLayout : 包含日志信息的级别和信息字符串
- org.apache.log4j.TTCCLayout : 包含日志产生的时间、线程、类别等等信息
实际开发中PatternLayout较为常用,通过conversionPattern属性设定日志信息的格式
- %m : 日志信息
- %M : 该日志信息所在的方法名
- %p : 日志级别,即DEBUG, INFO, ……,实际开发中,为保证该字段信息对齐,可以使用%-5p方式实现,意为该字段至少有5个字符,不足以空格填充该字段
- %r : 自启动到输出该日志信息耗费的时间(毫秒)
- %c : 该日志信息所在的类名
- %t : 输出该日志的线程名
- %n : 换行,Windows为”rn”,Unix为”n”
- %d : 输出该日志时的日期或时间,默认为ISO8601格式,也可以指定格式
例如:%d{yyyy-MM-dd HH:mm:ss,SSS} 表示 2002-10-18 22:10:28,921 - %l : 日志信息的发生位置及所在代码的行号;
1 | log4j.appender.out.layout = org.apache.log4j.PatternLayout |
使用
完成Log4J的配置后,在需要打日志的类中通过 Logger.getLogger(String name)方法 获取一个Logger的静态对象,形参name一般采用类名。需要日志输出直接调用相关的日志级别的方法即可,Demo代码 和 本文完整的Log4J配置 参见如下:
1 | public class User { |
1 | log4j.rootLogger = debug, out, file1, file2, file3 |