Log4j 使用方法

1 重要组件

  • 日志记录器(Logger),方便在程序里使用
  • 输出地(Appender),日志写入的文件
  • 日志格式化器(Layout),定义日志格式的

2 log4j 配置

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
44
45
46
47
48
49
50
51
52
# 存放 warn 及以下级别的日志
log4j.appender.mlog=org.apache.log4j.DailyRollingFileAppender
log4j.appender.mlog.File=logs/mlog/fuck.log
log4j.appender.mlog.encoding=UTF-8
# 追加与否, false 表示覆盖
log4j.appender.mlog.Append=true
log4j.appender.mlog.layout=org.apache.log4j.PatternLayout
log4j.appender.mlog.layout.ConversionPattern=%d %-4r [%t] (%F:%L) %-5p %c%x - %m%n
log4j.appender.mlogError.MaxFileSize = 200MB
log4j.appender.mlogError.MaxBackupIndex = 5
log4j.appender.mlogError.MaxFileCount = 10
log4j.appender.mlog.filter.F1=org.apache.log4j.varia.LevelRangeFilter
log4j.appender.mlog.filter.F1.LevelMax=warn

# 存放 error 及以上的日志
log4j.appender.mlogError.Threshold=error
log4j.appender.mlogError=org.apache.log4j.DailyRollingFileAppender
log4j.appender.mlogError.File=logs/mlog/fuck-error.log
log4j.appender.mlogError.encoding=UTF-8
log4j.appender.mlogError.Append=true
log4j.appender.mlogError.layout=org.apache.log4j.PatternLayout
log4j.appender.mlogError.layout.ConversionPattern=%d %-4r [%t] (%F:%L) %-5p %c%x - %m%n
log4j.appender.mlogError.MaxFileSize = 200MB
log4j.appender.mlogError.MaxBackupIndex = 5
log4j.appender.mlogError.MaxFileCount = 10

# 存储特定日志的文件
log4j.appender.useraction=org.apache.log4j.DailyRollingFileAppender
# useraction 的日志文件和路径不能改变
log4j.appender.useraction.File=logs/useraction.log
log4j.appender.useraction.encoding=UTF-8
log4j.appender.useraction.Append=true
log4j.appender.useraction.layout=org.apache.log4j.PatternLayout
log4j.appender.useraction.layout.ConversionPattern=%m%n
log4j.appender.useraction.MaxFileSize = 500MB
log4j.appender.useraction.MaxBackupIndex = 4
log4j.appender.useraction.MaxFileCount = 4

# stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=${mlog.layout}
log4j.appender.stdout.layout.ConversionPattern=${mlog.pattern}


# root logger
log4j.rootLogger=info, mlog, mlogError

# useraction logger
# 将 additivity 设为 false,表示日志不会交由 rootLogger 处理
log4j.logger.useraction=info, useraction
log4j.additivity.useraction=false

2.1 logger 的获取及 rootLogger 的作用

程序中获取 logger 一般采用如下形式:
LoggerFactory.getLogger(xxx.class)
表示获取一个 logger,其名为 xxx 的路径。
或者
LoggerFactory.getLogger("xxx")
表示获取名为 xxx 的logger。

rootLogger 为所有 logger 的祖先 logger。当想要获取的 logger 并未定义,则日志交由 rootLogger 来处理。

如果某个 logger 的 additivity 设为 true(默认值),则一旦该日志的打印等级在该 logger 允许的等级范围之内,除了会将该日志交由该 logger 对应的 appender 处理外,还会交给 rootLogger 处理

2.2 logger 和 appender 的双重权限

假设指定的 logger 为 useraction,一条日志的打印过程如下:

  • 先判断日志的打印级别是否在 useraction 这个 logger 指定的日志级别范围内。
    • 如果不在该范围,则不再继续查找 appender,处理结束;
    • 如果在该范围,则交由对应的 appender 处理。
      • 如果 useraction 的 additivity 为 true,则还会交由 rootLogger 处理;
      • 否则,不交由 rootLogger 处理。

appender 对于每条日志,也会判定日志打印级别是否在 appender 允许的范围之内。如果在该范围内,则打印到指定的文件里;否则不作处理。

如果一个 logger 对应了多个 appender,则该日志会交由每个 appender 处理。