og4j 2.x
版本相当于1.x
的版本多了很多的功能。
我比较喜欢的是可以通过kafka发送消息,这样的话,只要可以订阅kafka主题的客户端,都可以任意的操作了。
相对来说,2.x
版本的大体的组件相当于1.x
并没有太大的变化,
l
配置具体可以看http://logging.apache.org/log4j/2.x/manual/configuration.html,这篇文档中介绍了所有的configuration
的方式,可以任选一种比较熟悉的配置方式。
配置的查找优先级是
1. log4j2-test.properties
2. log4j2-test.yaml or log4j2-test.yml
3. log4j2-test.json or log4j2-test.jsn
4. log4j2-test.xml
5. log4j2.properties
6. log4j2.yaml or log4j2.yml
7. log4j2.json or log4j2.jsn
8. log4j2.xml
9. 如果什么都没有默认打印到控制台
官方的例子大多都是log4j2.xml
有一个新配置,是在Configuration
全局配置monitorInterval
属性,会自动检测配置文件是否更新
<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="5">
<!-- ... -->
</Configuration>
如果遇到问题,详细可以看这边博文
http://blog.csdn.net/u013076044/article/details/79186138
贴下我的配置
<?xml version="1.0" encoding="UTF-8"?>
<!--
- status : log4j2的日志级别
- monitorInterval : 表示5s 检测此配置文件是否改动,改动了就刷新,但是没效果。。。
-->
<Configuration status="WARN" monitorInterval="5">
<Properties>
<Property name="log.home">D:/logs/log4j2/</Property>
<Property name="fileName">D:/logs/log4j2/error.log</Property>
<Property name="log.html.filename">error</Property>
<Property name="log.level">ERROR</Property>
</Properties>
<!-- 第一层 默认所有日志过滤器 -->
<ThresholdFilter>
<level>${log.level}</level>
</ThresholdFilter>
<Appenders>
<!-- 控制台 appender -->
<Console name="console" target="SYSTEM_OUT">
<PatternLayout>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} %L - %msg%n</pattern>
</PatternLayout>
</Console>
<!-- error File -->
<File name="errorFile" fileName="${fileName}">
<ThresholdFilter>
<level>ERROR</level>
</ThresholdFilter>
<PatternLayout>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} %L - %msg%n</pattern>
</PatternLayout>
</File>
<!-- 每小时生成一个新的文件 并将旧的压缩-->
<RollingRandomAccessFile
name="errorHtmlFile"
fileName="${log.home}/html/${log.html.filename}.html"
filePattern="${log.home}/html/$${date:yyyy-MM-dd}/${log.html.filename}-%d{yyyy-MM-dd-HH}-%i.html.gz"
>
<ThresholdFilter>
<level>ERROR</level>
</ThresholdFilter>
<HtmlLayout>
<title>错误日志</title>
<locationInfo>true</locationInfo>
</HtmlLayout>
<Policies>
<!-- 日志超过6个小时生成一个新的日志,旧的归档 -->
<TimeBasedTriggeringPolicy interval="6" modulate="true"/>
<!-- 日志超过250M生成一个新的日志,旧的归档 -->
<SizeBasedTriggeringPolicy size="250 MB"/>
</Policies>
</RollingRandomAccessFile >
<Kafka name="kafka" topic="log-test">
<PatternLayout>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} %L - %msg%n</pattern>
</PatternLayout>
<Property name="bootstrap.servers">localhost:9092</Property>
</Kafka>
</Appenders>
<Loggers>
<Logger name="com.wuhulala.logger.log4j2" level="INFO" additivity="false">
<AppenderRef ref="console"/>
<AppenderRef ref="errorFile"/>
<AppenderRef ref="errorHtmlFile"/>
<AppenderRef ref="kafka"/>
</Logger>
<Root level="${log.level}">
<AppenderRef ref="console"/>
</Root>
</Loggers>
</Configuration>
重点看下kafka的配置
<Kafka name="kafka" topic="log-test">
<PatternLayout>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} %L - %msg%n</pattern>
</PatternLayout>
<Property name="bootstrap.servers">localhost:9092</Property>
</Kafka>
配置起来特别简单,只需要配置一下kafka-broker
的地址就好了,更详细的配置可以看
http://logging.apache.org/log4j/2.x/manual/appenders.html#KafkaAppender
需要注意一点,如果全局配置的日志级别是DEBUG
,那么kafka
的日志可能会被发送,导致递归停不下来,虽然我没有试验出来,但是最好还是注意一下
解决方案如下
<?xml version="1.0" encoding="UTF-8"?>
...
<Loggers>
<Root level="DEBUG">
<AppenderRef ref="Kafka"/>
</Root>
<!-- avoid recursive logging -->
<Logger name="org.apache.kafka" level="INFO" />
</Loggers>
maven依赖
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>0.10.2.0</version>
</dependency>
</dependencies>