一、官網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>