slf4j 搭配 log4j2 處理日志



關於 log4j

Log4j + Slf4j 的使用組合最為常見,但是我們知道 Log4j 目前已經停止更新了。Apache推出了新的 Log4j2 來代替 Log4j,Log4j2 是對Log4j 的升級,與其前身 Log4j 相比有了顯着的改進,並提供了許多 Logback 可用的改進,同時解決了 Logback 體系結構中的一些固有問題。因此,Log4j2 + Slf4j 應該是未來的大勢所趨。

關於 slf4j

  1. LF4J不同於其他日志類庫,與其它日志類庫有很大的不同。SLF4J(Simple logging Facade for Java)不是一個真正的日志實現,而是一個抽象層( abstraction layer),它允許你在后台使用任意一個日志類庫。如果是在編寫供內外部都可以使用的API或者通用類庫,那么你真不會希望使用你類庫的客戶端必須使用你選擇的日志類庫。
  2. 如果一個項目已經使用了log4j,而你加載了一個類庫,比方說 Apache Active MQ——它依賴於於另外一個日志類庫 logback,那么你就需要把它也加載進去。但如果 Apache Active MQ 使用了 SLF4J,你可以繼續使用你的日志類庫而無需忍受加載和維護一個新的日志框架的痛苦。
  3. 總的來說,SLF4J使你的代碼獨立於任意一個特定的日志API,這是對於 API 開發者的很好的思想。雖然抽象日志類庫的思想已經不是新鮮的事物,而且 Apache commons logging 也已經在使用這種思想了,但 SLF4J 正迅速成為Java世界的日志標准。

### 案例使用

引入 slf4j 和 log4j2 的核心包

<!-- slf4j核心包-->
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-api</artifactId>
	<version>1.7.25</version>
</dependency>
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>jcl-over-slf4j</artifactId>
	<version>1.7.25</version>
	<scope>runtime</scope>
</dependency>

<!--log4j2核心包-->
<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-core</artifactId>
	<version>2.8.2</version>
</dependency>
<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-api</artifactId>
	<version>2.8.2</version>
</dependency>
<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-slf4j-impl</artifactId>
	<version>2.8.2</version>
</dependency>
<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-web</artifactId>
	<version>2.8.2</version>
	<scope>runtime</scope>
</dependency>

<!--log4j2 異步依賴-->
<dependency>
	<groupId>com.lmax</groupId>
	<artifactId>disruptor</artifactId>
	<version>3.3.6</version>
</dependency>


log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="off" monitorInterval="120">
    <properties>
        <property name="LOG_HOME">/mytest_log</property>
    </properties>
    <appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>

        <!--RollingFile 為全局同步 RandomAccessFile 為異步-->
        <RollingRandomAccessFile name="rootAppeder"
                                 fileName="${LOG_HOME}/rattanapi.log"
                                 filePattern="${LOG_HOME}/$${date:yyyy-MM}/rattanapi-root-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %ex%msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="30"/>
        </RollingRandomAccessFile>

        <!--錯誤日志輸出-->
        <RollingRandomAccessFile name="errorAppeder"
                                 fileName="${LOG_HOME}/rattanapi-error.log"
                                 filePattern="${LOG_HOME}/$${date:yyyy-MM}/rattanapi-error-%d{yyyy-MM-dd}-%i.log">
            <Filters>
                <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %ex%msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="30"/>
        </RollingRandomAccessFile>

    </appenders>

    <loggers>
        <asyncRoot level="info">
            <!--根據配置文件是否打開 console輸出 -->
            <appender-ref ref="Console"/>
            <appender-ref ref="rootAppeder"/>
            <appender-ref ref="errorAppeder"/>
        </asyncRoot>
    </loggers>
</configuration>

web.xml中設置log4j2的監聽器和過濾器(servlet3.0及以上版本不需要該步操作)開發Servlet3.0的程序需要一定的環境支持。

<!--對於log4j2,Servlet2.5以前的版本需要-->
   <listener>
      <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
   </listener>
   <filter>
      <filter-name>log4jServletFilter</filter-name>
      <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
   </filter>
<filter-mapping>
      <filter-name>log4jServletFilter</filter-name>
      <url-pattern>/*</url-pattern>
      <dispatcher>REQUEST</dispatcher>
      <dispatcher>FORWARD</dispatcher>
      <dispatcher>INCLUDE</dispatcher>
      <dispatcher>ERROR</dispatcher>
 </filter-mapping>

注意:log4j2不再支持properties文件了,只支持xml,json或是yaml,不指定位置的情況下默認在src/main/resources下查找。

如果需要自定義位置,需要在上面的web.xml中添加以下代碼

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>
<context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>classpath:log4j2.xml</param-value>
</context-param>
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {
    private static final Logger logger = LoggerFactory.getLogger(Main.class);
    public static void main(String[] args) {
    String world = "world";
    logger.info("hellp world:{}",world);
    logger.error("exception e");
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM