日志探秘(二)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>

猜你喜欢

转载自blog.csdn.net/u013076044/article/details/79186852