slf4j+log4j2的整合配置
Log4j 2是log4j 1.x和logback的改進版,據說採用了一些新技術(無鎖非同步、等等),使得日誌的吞吐量、效能比log4j 1.x提高10倍,並解決了一些死鎖的bug,而且配置更加簡單靈活。下面是結合slf4j的配置和使用過程:
1、引用依賴包及相關注釋:
- 1
<!-- log配置:Log4j2 + Slf4j -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version >2.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.2</version>
</dependency>
<dependency> <!-- 橋接:告訴Slf4j使用Log4j2 -->
<groupId> org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.2</version>
</dependency>
<dependency> <!-- 橋接:告訴commons logging使用Log4j2 -->
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jcl</artifactId >
<version>2.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.10</version>
</dependency>
- 26
**注:**log4j-api-2.x 和 log4j-core-2.x是必須的,其他包根據需要引入,如下圖所示:
2、程式碼中使用:
@RunWith(SpringJUnit4ClassRunner.class) //使用Spring Junit4進行測試
@ContextConfiguration ({"classpath:spring/applicationContext.xml"}) //載入配置檔案
public abstract class BaseJunit4Test {
}
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
mport com.xjj.test.BaseJunit4Test;
public class Log4j2Test extends BaseJunit4Test {
static public Logger logger = LoggerFactory.getLogger(Log4j2Test.class);
@Test
public void logTC1(){
logger.error("error");
logger.debug("debug");
logger.info("info");
logger.trace("trace");
logger.warn("warn");
logger.error("error {}", "param");
}
}
- 78101112131415161711920222
輸出結果:
16:19:28.779 [main] ERROR com.xjj.test.mytest.Log4j2Test - error
16:19:28.781 [main] ERROR com.xjj.test.mytest.Log4j2Test - error param
- 1
注:如果沒有任何配置,Log4j2會使用預設配置:
root logger:ConsoleAppender
PatternLayout:"%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"
- 1
級別:ERROR
在classpath中建立名字為log4j2.xml的配置檔案。
Configuration標籤中的常用元素說明:
monitorInterval:Log4j 2 定期檢查和應用配置檔案的時間間隔(單位:秒,如果更改配置檔案,不用重啟系統)。
status:Log4j內部事件記錄的等級,只對Log4j本身的事件有效。
strict:是否使用XML Schema來檢查配置檔案。
schema:Shema檔案的位置。
例子:
<Configuration status="warn" monitorInterval="30" strict="true" schema="Log4J-V2.2.xsd">
……
</Configuration>
- 13
Loggers標籤說明:
它被用來配置LoggerConfig,包含一個root logger和若干個普通logger
普通必須有一個name元素,root logger不用name元素
每個logger可以指定一個level(TRACE, DEBUG, INFO, WARN, ERROR, ALL or OFF),不指定時level預設為ERROR
additivity指定是否同時輸出log到父類的appender,預設為true。(層級關係與Java包類似,例如:com.foo是com.foo.Bar的父級;java是java.util的父級,是java.util.vector的祖先。root是最頂層。)
每個logger可以包含若干個屬性:AppenderRef, Filter, Layout, 等
例子:
<Loggers>
<Root level="warn"> <!-- 全域性配置 -->
<AppenderRef ref="Console"/>
</Root>
<!-- 為某些包/類配置Log級別,這些logger繼承了root logger -->
<Logger name="com.xjj.test" level="TRACE"/>
<Logger name="com.xjj.test2" level="DEBUG" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
</Loggers>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
Filters標籤說明:
與防火牆過濾的規則相似,log4j2的過濾器也將返回三類狀態:Accept(接受), Deny(拒絕) 或Neutral(中立)。其中,Accept意味著不用再呼叫其他過濾器了,這個LogEvent將被執行;Deny意味著馬上忽略這個event,並將此event的控制權交還給過濾器的呼叫者;Neutral則意味著這個event應該傳遞給別的過濾器,如果再沒有別的過濾器可以傳遞了,那麼就由現在這個過濾器來處理。
Appenders標籤說明:
Appender用來定義不同的輸出位置,可以是console、檔案、遠端socket伺服器、Apache Flume、JMS以及遠端 UNIX 系統日誌守護程序。一個Logger可以繫結多個不同的Appender。
Layout/PatternLayout:
定義log的格式(一種類似C語言printf函式的列印格式)。
配置例子和註解如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<!-- Log4j 2.x 配置檔案。每30秒自動檢查和應用配置檔案的更新; -->
<Configuration status="warn" monitorInterval="30" strict="true" schema="Log4J-V2.2.xsd">
<Appenders>
<!-- 輸出到控制檯 -->
<Console name="Console" target="SYSTEM_OUT">
<!-- 需要記錄的級別 -->
<!-- <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY" /> -->
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%F:%L) - %m%n" />
</Console>
<!-- 輸出到檔案,按天或者超過80MB分割 -->
<RollingFile name="RollingFile" fileName="../logs/xjj.log" filePattern="../logs/$${date:yyyy-MM}/xjj-%d{yyyy-MM-dd}-%i.log.gz">
<!-- 需要記錄的級別 -->
<!-- <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" /> -->
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%F:%L) - %m%n" />
<Policies>
<OnStartupTriggeringPolicy />
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="80 MB" />
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Root level="info"> <!-- 全域性配置 -->
<AppenderRef ref="Console" />
<AppenderRef ref="RollingFile"/>
</Root>
<!-- 為sql語句配置特殊的Log級別,方便除錯 -->
<Logger name="com.xjj.dao" level="${log.sql.level}" additivity="false">
<AppenderRef ref="Console" />
</Logger>
</Loggers>
</Configuration>
- 3
實際使用的例子(用slf4j介面):
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private final static Logger logger = LoggerFactory.getLogger(MyClass.class);
try {
……
} catch (Exception e) {
logger.error("發生了異常:", e);
}
logger.info("請求處理結束,耗時:{}毫秒", (System.currentTimeMillis() - beginTime)); //第一種用法
logger.info("請求處理結束,耗時:" + (System.currentTimeMillis() - beginTime) + "毫秒"); //第二種用法
- 2