最近再弄项目的log4j日志升级,中间也遇到一些问题,现在尽可能完整的总结一下,方便以后查看,同时也可以给需要的网友们参考。由于今天心情不是很在状态,不想闲扯淡,直接进入正题
对于log4j1.x的配置这里不多说,网上有很多资料,也不是今天的主题
-
日志升级过程
1.1 删除 log4j1.x jar 包(使用ant命令打包的话同时删除ivy.xml里面的jar包配置信息)
1.2 将 log4j2.x jar 包添加到classPath目录下(包含类似 log4j-1.2-api-2.3.jar 这种升级过渡包,保证原来代码中的log不用修改)
1.3 新增 log4j2.xml 配置文件(删除原来的配置文件 log4j.properties ),配置文件在下文详细说明
1.4 修改 web.xml 文件<context-param> <!-- <param-name>log4jConfigLocation</param-name> --> <param-name>log4jConfiguration</param-name> <param-value>classpath:log4j2.xml</param-value> </context-param>
对于参数 param-name 未修改时,日志没打出来,网上说是修改为 log4jConfiguration ,确实管用(可以再测试下)
-
log4j2.xml 配置文件说明
<?xml version="1.0" encoding="UTF-8"?> <!-- status:log4j2自身内部的信息输出 monitorInterval:每隔60秒重新读取配置文件,可以不重启应用的情况下修改配置 --> <configuration status="info" monitorInterval="60"> <Properties> <!-- <property name="path">/was/applogs/rtlog/cnbs</property> --> <property name="path">D:/cnbs/docs/测试文件/log4j2</property> </Properties> <Appenders> <!-- 定义控制台输出 --> <Console name="CONSOLE" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss:SSS} [%p] [%t] %c{1} - %m%n" /> </Console> <!-- 当满足一定条件后,就重命名原日志文件用于备份,并从新生成一个新的日志文件 fileName:指定当前日志文件的位置和文件名称 filePattern:指定当发生Rolling时,文件的转移和重命名规则 SizeBasedTriggeringPolicy:指定当文件体积大于size指定的值时,触发Rolling DefaultRolloverStrategy:指定最多保存的文件个数 --> <!-- base包日志格式设置 --> <RollingRandomAccessFile name="base" fileName="${path}/base.log" filePattern="${path}/base-%d{yyyy-MM-dd HH-mm}-%i.log"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss:SSS} [%p] [%t] %c{1} - %m%n" /> <Policies> <SizeBasedTriggeringPolicy size="2048KB" /> </Policies> <DefaultRolloverStrategy max="20" /> </RollingRandomAccessFile> <!-- system包日志格式设置 --> <RollingRandomAccessFile name="system" fileName="${path}/system.log" filePattern="${path}/system-%d{yyyy-MM-dd HH-mm}-%i.log"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss:SSS} [%p] [%t] %c{1} - %m%n" /> <Policies> <SizeBasedTriggeringPolicy size="2048KB" /> </Policies> <DefaultRolloverStrategy max="5" /> </RollingRandomAccessFile> <!-- bizTran包日志格式设置 --> <RollingRandomAccessFile name="bizTran" fileName="${path}/bizTran.log" filePattern="${path}/bizTran-%d{yyyy-MM-dd HH-mm}-%i.log"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss:SSS} [%p] [%t] %c{1} - %m%n" /> <Policies> <SizeBasedTriggeringPolicy size="102400KB" /> </Policies> <DefaultRolloverStrategy max="10" /> </RollingRandomAccessFile> <!-- esb包日志格式设置 --> <RollingRandomAccessFile name="esb" fileName="${path}/esb.log" filePattern="${path}/esb-%d{yyyy-MM-dd HH-mm}-%i.log"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss:SSS} [%p] [%t] %c{1} - %m%n" /> <Policies> <SizeBasedTriggeringPolicy size="204800KB" /> </Policies> <DefaultRolloverStrategy max="100" /> </RollingRandomAccessFile> <!-- sqlmsg包日志格式设置 --> <RollingRandomAccessFile name="sqlmsg" fileName="${path}/sqlmsg.log" filePattern="${path}/sqlmsg-%d{yyyy-MM-dd HH-mm}-%i.log"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss:SSS} [%p] [%t] %c{1} - %m%n" /> <Policies> <SizeBasedTriggeringPolicy size="10240KB" /> </Policies> <DefaultRolloverStrategy max="20" /> </RollingRandomAccessFile> <!-- error日志格式设置 --> <RollingRandomAccessFile name="error" fileName="${path}/error.log" filePattern="${path}/error-%d{yyyy-MM-dd HH-mm}-%i.log"> <!-- error.log只输出ERROR及以上级别的日志,匹配则接收(ACCEPT),否则直接拒绝(DENY) --> <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY" /> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss:SSS} [%p] [%t] %c{1} - %m%n" /> <Policies> <SizeBasedTriggeringPolicy size="10240KB" /> </Policies> <DefaultRolloverStrategy max="10" /> </RollingRandomAccessFile> <Async name="Asyncaa" bufferSize="2000" blocking="false"> <AppenderRef ref="kafkaAppender" /> </Async> <Kafka name="kafkaAppender"> <Config key="kafka.bootstrap.servers" value="10.20.26.193:9092,10.20.26.194:9092,10.20.26.195:9092" /> <Config key="topic" value="866252_cnbs" /> </Kafka> </Appenders> <Loggers> <Logger name="com.ibatis" level="DEBUG"> <AppenderRef ref="sqlmsg" /> <AppenderRef ref="Asyncaa" /> </Logger> <Logger name="java.sql.Connection" level="DEBUG"> <AppenderRef ref="sqlmsg" /> <AppenderRef ref="Asyncaa" /> </Logger> <Logger name="java.sql.Statement" level="DEBUG"> <AppenderRef ref="sqlmsg" /> <AppenderRef ref="Asyncaa" /> </Logger> <Logger name="java.sql.PreparedStatement" level="DEBUG"> <AppenderRef ref="sqlmsg" /> <AppenderRef ref="Asyncaa" /> </Logger> <Logger name="com.paic.cnbs.base" level="DEBUG"> <AppenderRef ref="base" /> <AppenderRef ref="CONSOLE" /> <AppenderRef ref="Asyncaa" /> </Logger> <Logger name="com.paic.cnbs.system" level="DEBUG"> <AppenderRef ref="system" /> <AppenderRef ref="CONSOLE" /> <AppenderRef ref="Asyncaa" /> </Logger> <Logger name="com.paic.cnbs.bizTran" level="DEBUG" additivity="true"> <AppenderRef ref="bizTran" /> <AppenderRef ref="CONSOLE" /> <AppenderRef ref="Asyncaa" /> </Logger> <Logger name="com.paic.cnbs.esb" level="DEBUG"> <AppenderRef ref="esb" /> <AppenderRef ref="CONSOLE" /> <AppenderRef ref="Asyncaa" /> </Logger> <!-- 输出位置信息(类名、行数等) --> <Root level="ERROR" includeLocation="true"> <AppenderRef ref="error" /> </Root> </Loggers> </configuration>
这个文件是对不同包下面的日志分别记录,比如 com.paic.cnbs.bizTran 包下的日志会输出到 bizTran 及 CONSOLE 配置的AppenderRef 中,对于该文件有几点说明:
2.1 文件中增加了 Kafka 配置,这是因为日志需要接入到第三方日志平台增加的配置
2.2 additivity 配置的作用
Root 为日志等级全局配置,Logger 个性化配置某些区域的日志,而 Logger 继承于 Root。所以,这时 additivity 发挥作用了,当 additivity="true"(默认为true)时,Logger 配置的日志输出在 Root 中会再输出一次。比如,com.paic.cnbs.bizTran 包下的日志配置输出到 bizTran.log 中,并且 additivity="true",此时,该包下的日志会在 Root 配置的 error.log 中再输出一次。或许你会说,Root 配置的 level="ERROR",很遗憾的告诉你,这个 ERROR 并不能过滤掉 ERROR 以下级别的日志。那么,想要在 error.log 中只打印 ERROR 级别的日志怎么办呢? 请看 2.3 的说明
2.3 细心的人可能已经注意到,在 Root 的日志输出配置 Appender 中加了个过滤器<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY" />
这是什么意思呢?请看注释吧
2.4 其他说明
各个节点的配置都已经注释得很清楚了,没什么其他的说明
- 总结
本次升级的版本是 log4j2.3 ,支持 jdk1.6,在 2.3 以后的版本需要 jdk1.7 的支持。只要把各个节点以及参数的意义弄清楚,也没那么复杂。或许,也还有其他的问题是我没有发现或者没有提到甚至是有说的不清楚或不准确的,也希望朋友们能积极的提出来。另外,对于当下中印对峙局势愈发紧张,中印大战一触即发,作为爱国爱军的我,也只能默默的刷刷新闻然后在心里耻笑印度到底会落的什么糗样