企业开发-log4j 最新版本2使用简介

扶醉桌前 提交于 2020-05-04 12:36:15

1、官网http://logging.apache.org/log4j/2.x/index.html

2、SLF4J目前已经是业界标准,完整兼容和实现

3、如何兼容版本1?log4j-1.2-api-2.4.1.jar这个包,但是还是有一些接口是变化了,个人看了下都是些不常用的接口变了,如果你用到请修改源代码。参考官方

http://logging.apache.org/log4j/2.x/manual/migration.html

4、多个SLF4J实现不能共存,共存需要解决一些冲突问题

5、log4j-slf4j-impl和log4j-to-slf4j不能共存,从名称就能看出一个是log4j对SLF4J的实现,一个是反过来。一起会报错

6、新特征:支持异步日志更强大。因为公司需要分布式日志,所以是用scala actor写的,当时也有测试使用Disruptor,效率极高,没想到就出来了,哈哈。

7、新的语法

logger.debug("Logging in user %s with birthday %s", user.getName(), user.getBirthdayCalendar());
logger.debug("Logging in user %1$s with birthday %2$tm %2$te,%2$tY", user.getName(), user.getBirthdayCalendar());
logger.debug("Integer.MAX_VALUE = %,d", Integer.MAX_VALUE);

熟悉吧,经典语法

还有一新,不过要jdk8才支持,表达式


if (logger.isTraceEnabled()) {
logger.trace("Some long-running operation returned {}", expensiveOperation());
}
变为
// Java-8 style optimization: no need to explicitly check the log level:
// the lambda expression is not evaluated if the TRACE level is not enabled
logger.trace("Some long-running operation returned {}", () -> expensiveOperation());

别再操劳的了,复制后不需要修改,今天我就他r的改了几是个文件,发现新语法不要那么麻烦,无语了

package org.apache.test;
public class MyTest {//下面那句按照习惯复制后是不是要修改类名,有时还jb忘了?
private static final Logger logger = LogManager.getLogger(MyTest.class.getName());
}
//新语法可以这样
package org.apache.test;
public class MyTest {
private static final Logger logger = LogManager.getLogger();
}


8、配置文件搜索先后顺序:

log4j2-test.yaml或者log4j2-test.yml
-》log4j2-test.json或者log4j2-test.jsn
-》log4j2-test.xml
如果没有带test的文件,那么去掉test,重样来一遍

log4j2.yaml或者log4j2.yml 
-》log4j2.json或者log4j2.jsn
-》log4j2.xml 

这种逻辑导致正式部署的时候必须记得改配置文件名字

9、多个logger导致日志被打印多次配置additivity=false可以禁止任何父logger打印,默认root里面的都是其它logger的老爹


<?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>
<Logger name="com.foo.Bar" level="trace" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>


10、设置配置文件重载时间monitorInterval="30",单位是秒,此配置保证修改后无需重启服务器


<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="30">
...
</Configuration>


11、输出到文件的简单例子,这里需要注意的是文件路径使用相对路径jboss下会到bin下面,其它容器各有不同,也许和操作系统都有关系,提醒注意


<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="10" status="debug">
    <!--先定义所有的appender-->
    <appenders>
        <!--这个输出控制台的配置-->
        <Console name="Console" target="SYSTEM_OUT">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--这个都知道是输出日志的格式-->
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </Console>
        <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
        <File name="log" fileName="logs/test.log" append="false">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </File>

        <!--这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="RollingFile" fileName="logs/app.log"
                     filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
            <SizeBasedTriggeringPolicy size="50MB"/>
        </RollingFile>
    </appenders>
    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
    <loggers>
        <!--建立一个默认的root的logger-->
        <root level="debug">
            <appender-ref ref="log"/>
            <appender-ref ref="Console"/>
        </root>

    </loggers>
</Configuration>


12、日志过滤,达到不同文件输出不同级别日志的目标,除了下面使用过滤器的做法,另外一种就是直接诶在logger标记上写level,指向不同的数据目标。

主要是要理解ThresholdFilter的onMatch/onMismatch的三个选项值:ACCEPT/DENY/NEUTRAL。
如果有多个ThresholdFilter,那么Filters是必须的,同时在Filters中,首先要过滤不符合的日志级别,把不需要的首先DENY掉,然后再ACCEPT需要的日志级别,这个次序不能搞颠倒。可把下面code添加到上面的append是实例下面

<Filters>  
      <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>  
      <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>  
 </Filters>





易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!