Log4j 1.2 都已经不再维护了, 为什么还有总结
- 确实还有很多在用的
- 确实还有很多不清楚的地方
Log4j 的三大组成部分, Logger, Appender, Layouts
网上大部分的文章都是讲 Appender的, 讲PatternLayout里的那些 format, 但是很少有讲Logger, 确实也很奇怪
Level
在说Logger之前要说Level, 后面有跟Level相关的内容
标准的Log4j的Level有 TRACE, DEBUG, INFO, WARN, ERROR, FATAL
他们的顺序是 TRACE<DEBUG<INFO<WARN<ERROR<FATAL
Logger
RootLogger
RootLogger 两大特性
- 永远存在
- 不能通过名字获取
- 必须要设定Level
所以总看网上的配置是类似这样的
log4j.rootLogger=debug,A1,A2,A3
这就是在给rootLogger设置Level
Logger 是有层级的
-
Level是继承的
如果没有特别指定, 则找离自己有明确设定的祖先的Level进行继承, 如果都没有, 就找rootLogger
当在代码里调用logger的输出方法, 比如debug(), info(), warn(), error(),等方法时, Log4j的逻辑是, 只有当调用的Level>=logger 设置的Level时, 消息才能被显示, 比如
调用debug()的时候, 对应logger设置的Level要小于等于Debug时, 消息才能被显示, 所以总要找到一个结果的Level进行比较, 如果它自己的logger没有设置, 则会找它的parent logger的设置, 直到找到设置的Level, 或者找到rootLogger为止 -
Appender是冒泡的, 官方的叫法是 Appender additivity
除非 additivity flag设置为false, 否则, 就冒泡到rootLogger
LoggerName | Add Appender | Additivity | Output Targets |
---|---|---|---|
root | A1 | 无 | A1 |
x | A-x1, A-x2 | true | A1, A-x1, A-x2 |
x.y | 无 | true | A1, A-x1, A-x2 |
x.y.z | A-xyz1 | true | A1, A-x1, A-x2, A-xyz1 |
security | A-sec | false | A-sec |
security.access | 无 | true | A-sec |
这个表就说明, 当additivity flag设置为true的时候, 就会冒泡, 也就是输出完自己的Appender之后, 会向上找parent Appender进行输出, 直到 遇到 additivity flag 为false, 或者到rootLogger为止
定义Logger
在log4j.properties文件上
log4j.logger.yourloggername=Level,appender1,...appenderN
比如
log4j.logger.com.foo.bar=debug, A1
设置 additivity flag
在log4j.properties上 官网地址
log4j.additivity.com.foo.bar=false
Appender
网上说了很多的Appender, 很多说的都很详细, 我在这里就不再重复了, 官网的语法在这里, 它这个说的不具体, 还不如网上翻译的更具体了
Layouts
主要是 PatternLayout, 网上说的也很多, 唯一的问题在于, 官网上的WARNING还是要注意一下的
Conversion Character | Warning |
---|---|
C | WARNING Generating the caller class information is slow. Thus, use should be avoided unless execution speed is not an issue. |
F | WARNING Generating caller location information is extremely slow and should be avoided unless execution speed is not an issue. |
l | The location information can be very useful. However, its generation is extremely slow and should be avoided unless execution speed is not an issue. |
L | WARNING Generating caller location information is extremely slow and should be avoided unless execution speed is not an issue. |
M | WARNING Generating caller location information is extremely slow and should be avoided unless execution speed is not an issue. |
总结
- rootLogger的Level一般要设置的比较高, 因为它相当于是默认
- 自己定义的logger除了设置Level以外, 还要设置appender, 把自己关心的日志内容从总的日志文件中分离出来
- 如果没有必要, 就把additivity设置为false, 不然同样的日志内容出现在多个appender中, 即不得看, 也占用磁盘空间