企業開發-log4j 最新版本2使用簡介

一、官網http://logging.apache.org/log4j/2.x/index.html html

二、SLF4J目前已是業界標準,完整兼容和實現 java

三、如何兼容版本1?log4j-1.2-api-2.4.1.jar這個包,可是仍是有一些接口是變化了,我的看了下都是些不經常使用的接口變了,若是你用到請修改源代碼。參考官方 express

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

四、多個SLF4J實現不能共存,共存須要解決一些衝突問題 json

五、log4j-slf4j-impl和log4j-to-slf4j不能共存,從名稱就能看出一個是log4j對SLF4J的實現,一個是反過來。一塊兒會報錯 api

六、新特徵:支持異步日誌更強大。由於公司須要分佈式日誌,因此是用scala actor寫的,當時也有測試使用Disruptor,效率極高,沒想到就出來了,哈哈。 服務器

七、新的語法 app

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();
}


八、配置文件搜索前後順序:

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 

這種邏輯致使正式部署的時候必須記得改配置文件名字

九、多個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>


十、設置配置文件重載時間monitorInterval="30",單位是秒,此配置保證修改後無需重啓服務器


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


十一、輸出到文件的簡單例子,這裏須要注意的是文件路徑使用相對路徑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>


十二、日誌過濾,達到不一樣文件輸出不一樣級別日誌的目標,除了下面使用過濾器的作法,另一種就是直接誒在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>
相關文章
相關標籤/搜索