Log4J(1.X) 配置、使用

Log4J,Apache下的一个开源日志组件框架,目前有1.X和2.X(Log4J2)两个版本,本文将介绍其1.X版本的配置、使用

abstract

概述

在使用日志组件之前,更多的是使用System.out.println输出log来调试代码,但是在大型项目运行起来后,该方法存在诸多不便(无法对输出信息分级,序列化,查找不便等等),这时候,而使用日志组件就可以很好的解决该问题

Log4J,是一个广泛应用于Java Web服务中的日志组件实现,配置方便使用简单,其主要有如下三个组件:

  • Logger: 获取日志信息
  • Appender: 确定日志信息的输出目的地
  • Layout: 定义日志信息的输出格式

添加Maven依赖

在 pom.xml 文件中添加 Log4J 的Maven依赖即可

1
2
3
4
5
6
<!-- Log4J -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>

配置文件 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

  1. 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)的级别
  1. FileAppender

日志文件输出器常用配置如下:

1
2
3
4
5
6
log4j.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

  1. DailyRollingFileAppender

日志文件输出器(按天存储)常用配置如下:

1
2
3
4
5
6
log4j.appender.file2 = org.apache.log4j.DailyRollingFileAppender
# 指定日志文件路径
log4j.appender.file2.File = /Users/zgh/log/log2
# 指定包含日期信息的日志文件名后缀
log4j.appender.file2.DatePattern='.'yyyy-MM-dd'.log'
log4j.appender.file2.threshold = info

Note:

  • 需要注意的是,该输出器在会先生成一个log2的日志文件并向其中写入的当天(令日期为8.10)日志信息,在第二天时(8.11日),才会将log2文件重命名为log2.2019-08-10.log,同时重新生成一个新的log2文件用于写入当天的日志。所以,查看日志时,是找不到包含当天日期文件名的日志文件
  1. RollingFileAppender

日志文件输出器(按文件大小存储)常用配置如下:

1
2
3
4
5
6
7
log4j.appender.file3 = org.apache.log4j.RollingFileAppender
log4j.appender.file3.file = /Users/zgh/log/log3.log
# 日志文件大小最大值
log4j.appender.file3.MaxFileSize = 2KB
# 备份日志文件最大数目,默认为1
log4j.appender.file3.MaxBackupIndex = 3
log4j.appender.file3.append = true;

当当前的日志文件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
2
log4j.appender.out.layout = org.apache.log4j.PatternLayout
log4j.appender.out.layout.conversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} [%t %r] %m%n

使用

完成Log4J的配置后,在需要打日志的类中通过 Logger.getLogger(String name)方法 获取一个Logger的静态对象,形参name一般采用类名。需要日志输出直接调用相关的日志级别的方法即可,Demo代码 和 本文完整的Log4J配置 参见如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class User {
...
// 获取一个Logger对象,
private static Logger logger = Logger.getLogger(User.class.getName());
private int id;
private String name;
private int age;
public int getAge() {
// 输出debug级别日志
logger.debug("getAge: " + age );
// 输出info级别日志
logger.info("getAge: " + age );
return age;
}
...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
log4j.rootLogger = debug, out, file1, file2, file3

# out
# set appender
log4j.appender.out = org.apache.log4j.ConsoleAppender
#log4j.appender.out.target = System.out
log4j.appender.out.threshold = info
# set layout
log4j.appender.out.layout = org.apache.log4j.PatternLayout
log4j.appender.out.layout.conversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} [%t %r] %m%n

# file1
# set appender
log4j.appender.file1 = org.apache.log4j.FileAppender
log4j.appender.file1.File = /Users/zgh/log/log1.log
log4j.appender.file1.threshold = warn
log4j.appender.file1.append = false
# set layout
log4j.appender.file1.layout = org.apache.log4j.PatternLayout
log4j.appender.file1.layout.conversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} %m%n


# file2
# set appender
log4j.appender.file2 = org.apache.log4j.DailyRollingFileAppender
log4j.appender.file2.File = /Users/zgh/log/log2
log4j.appender.file2.DatePattern='.'yyyy-MM-dd'.log'
log4j.appender.file2.threshold = info
# set layout
log4j.appender.file2.layout = org.apache.log4j.PatternLayout
log4j.appender.file2.layout.conversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} [%t %r] %m%n


#file3
# set appender
log4j.appender.file3 = org.apache.log4j.RollingFileAppender
log4j.appender.file3.file = /Users/zgh/log/log3.log
log4j.appender.file3.MaxFileSize = 2KB
log4j.appender.file3.MaxBackupIndex = 3
log4j.appender.file3.append = true;
#set layout
log4j.appender.file3.layout = org.apache.log4j.PatternLayout
log4j.appender.file3.layout.conversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} [%t %r] %m%n
0%