日志探秘(二)log4j 2.x 初探


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>

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com