log4j 2的配置(输出日志到WEB项目目录、不同级别日志保存不同文件、日志压缩等)
官方下载地址http://logging.apache.org/log4j/2.x/download.html
官方配置说明http://logging.apache.org/log4j/2.x/manual/configuration.html#SystemProperties
log4j 2版本已经不支持properties类型的配置文件了
Log4j 2.3是最后支持JAVA 6的版本,log4j组件2.4以后的版本已经能够支持.properties格式的配置文件(之前的2.x版均不支持.properties配置),默认配置文件名称及优先级如下(配置文件路径要放在classpath下):
优先级 |
文件类型 |
文件名 |
1 |
properties |
log4j2-test.properties |
2 |
YAML |
log4j2-test.yaml log4j2-test.yml |
3 |
JSON |
log4j2-test.json log4j2-test.jsn |
4 |
XML |
log4j2-test.xml |
5 |
properties |
log4j2.properties |
6 |
YAML |
log4j2.yaml log4j2.yml |
7 |
JSON |
log4j2.json log4j2.jsn |
8 |
XML |
log4j2.xml |
在没有任何配置的情况下,log4j2会使用默认配置:
1 2 3 4 5 6 7 8 9 10 11 12 13
| <?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> </Console> </Appenders> <Loggers> <Root level="error"> <AppenderRef ref="Console" /> </Root> </Loggers> </Configuration>
|
该配置只有一个Appender:Console,目标是SYSTEM_OUT,即日志内容,都会打印在控制台上。Root Logger的级别是error,即:所有error及以上级别的日志才会记录。
(注:日志级别顺序为 TRACE < DEBUG < INFO < WARN < ERROR < FATAL ),所以最终只有2日志会输出(error,fatal)
配置第1行中的status=”WARN”,可以去掉,它的含义为是否记录log4j2本身的event信息,默认是OFF,设置成“WARN”指:所有log4j2的event信息中,只有WARN及以上级别的信息才记录,大家可以把它改成TRACE试试(最低级别),看下输出内容有何变化。
再讲下如何把不同级别的日志,输出到不同的日志文件中以及文件大小限制及压缩。这个在网上,包括官网上,都没有一个是说清楚的。
比如,希望trace/debug级别的日志输出到debug.log,而info级别的日志输出到info.log,其他如warn/error/fatal级别的日志都输出到error.log,这样分开输出是有好处的。我们按照如下的log42j.xml的配置,即可实现这样的输出。
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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| <?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF"> <Properties> <property name="log_pattern">%d{yyyy-MM-dd HH:mm:ss z} %-5level %class{36}%L%M - %msg%xEx%n</property> <property name="log-path">${web:rootDir}/logs</property> <property name="every_file_size">5M</property> <property name="output_log_level">debug</property> </Properties>
<appenders>
<Console name="Console" target="SYSTEM_OUT"> <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" /> <PatternLayout pattern="${log_pattern}" /> </Console> <RollingFile name="app_debug" fileName="${log-path}/debug/debug.log" filePattern="${log-path}/debug/debug-%d{yyyy-MM-dd}-%i.log.gz"> <Filters> <ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL" /> <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="NEUTRAL" /> </Filters> <PatternLayout pattern="${log_pattern}" /> <SizeBasedTriggeringPolicy size="${every_file_size}"/> </RollingFile> <RollingFile name="app_info" fileName="${log-path}/info/info.log" filePattern="${log-path}/info/info-%d{yyyy-MM-dd}-%i.log.gz"> <Filters> <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL" /> <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" /> </Filters> <PatternLayout pattern="${log_pattern}" /> <SizeBasedTriggeringPolicy size="${every_file_size}"/> </RollingFile> <RollingFile name="app_error" fileName="${log-path}/error/error.log" filePattern="${log-path}/error/error-%d{yyyy-MM-dd}-%i.log.gz"> <Filters> <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY" /> </Filters> <PatternLayout pattern="${log_pattern}" /> <SizeBasedTriggeringPolicy size="${every_file_size}"/> </RollingFile>
</appenders>
<loggers> <root level="${output_log_level}"> <appender-ref ref="Console" /> <appender-ref ref="app_debug"/> <appender-ref ref="app_info"/> <appender-ref ref="app_error"/> </root> </loggers>
</configuration>
|
主要是要理解ThresholdFilter的onMatch/onMismatch的三个选项值:ACCEPT/DENY/NEUTRAL,其实,根据字面意思,也很好理解。
重要的是,如果有多个ThresholdFilter,那么Filters是必须的,同时在Filters中,首先要过滤不符合的日志级别,把不需要的首先DENY掉,然后再ACCEPT需要的日志级别,这个次序不能搞颠倒。
原文地址:http://hifor.net/posts/20150926-304680b6.html