天天看點

java日志統一內建的兩種方案Slf4j架構Log4j日志內建Logback日志內建總結

slf4j架構

Log4j日志內建

Logback日志內建

總結

分享的目的

一次性的解決應用中日志遇到的各種問題,包括:消除應用啟動過程中與日志系統相關的無用錯誤提示,日志列印不出來的問題等;

Slf4j架構

  1. SLF4J,即簡單日志門面(Simple Logging Facade for Java),不是具體的日志解決方案,它隻服務于各種各樣的日志系統。按照官方的說法,SLF4J是一個用于日志系統的簡單Facade,允許最終使用者在部署其應用時使用其所希望的日志System,通俗的講,slf4j提供了目前Java日志系統的擴充卡;
  2. SLF4J所提供的核心API是一些接口以及一個LoggerFactory的工廠類,有點類似于JDBC,在使用SLF4J的時候,不需要在代碼中或配置檔案中指定你打算使用那個具體的日志系統(SPI)。如同使用JDBC基本不用考慮具體資料庫一樣,SLF4J提供了統一的記錄日志的接口,隻要按照其提供的方法記錄即可,最終日志的格式、記錄級别、輸出方式等通過具體日志系統的配置來實作,是以可以在應用中靈活切換日志系統。

公共的Maven依賴

<dependency>
         <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
         <version>${slf4j.verson}</version>
</dependency>
<!-- 适配log4j -->
<dependency>
        <groupId>org.slf4j</groupId>
       <artifactId>slf4j-log4j12</artifactId>
       <version>${slf4j.verson}</version>
</dependency>
<!-- 适配jcl(Jakarta Commons Logging ) -->
<dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>jcl-over-slf4j</artifactId>
       <version>${slf4j.verson}</version>
</dependency>
<!-- 适配jul java.util.logging -->
<dependency>
      <groupId>org.slf4j</groupId>
     <artifactId>jul-to-slf4j</artifactId>
     <version>${slf4j.verson}</version>
</dependency>           

log4j依賴

<dependency>
          <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>${log4j.verson}</version>
</dependency>           

排除的依賴

<exclusion>
         <groupId>ch.qos.logback</groupId>
         <artifactId>logback-core</artifactId>
<exclusion>

<exclusion>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
<exclusion>

<exclusion>
         <groupId>ch.qos.logback</groupId>
         <artifactId>logback-access</artifactId>
<exclusion>

<exclusion>
       <groupId>org.logback-extensions</groupId>
    <artifactId>logback-ext-spring</artifactId>
<exclusion>

<exclusion>
    <groupId>commons-logging</groupId>
     <artifactId>commons-logging</artifactId>
</exclusion>           

<dependency>
         <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
         <version>${slf4j.verson}</version>
</dependency>
<!-- 适配log4j -->
<dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>log4j-over-slf4j</artifactId>
       <version>${slf4j.verson}</version>
</dependency>
<!-- 适配jcl(Jakarta Commons Logging ) -->
<dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>jcl-over-slf4j</artifactId>
       <version>${slf4j.verson}</version>
</dependency>
<!-- 适配jul java.util.logging -->
<dependency>
      <groupId>org.slf4j</groupId>
     <artifactId>jul-to-slf4j</artifactId>
     <version>${slf4j.verson}</version>
</dependency>
<dependency>
         <groupId>ch.qos.logback</groupId>
         <artifactId>logback-core</artifactId>
         <version>${logback.version}</version>
</dependency>
<dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>${logback.version}</version>
</dependency>
<dependency>
          <groupId>ch.qos.logback</groupId>
          <artifactId>logback-access</artifactId>
           <version>${logback.version}</version>
</dependency>
<dependency>
     <groupId>org.logback-extensions</groupId>
     <artifactId>logback-ext-spring</artifactId>
     <version>0.1.2</version>
</dependency>           

Logback依賴

<dependency>
         <groupId>ch.qos.logback</groupId>
         <artifactId>logback-core</artifactId>
         <version>${logback.version}</version>
</dependency>
<dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>${logback.version}</version>
</dependency>
<dependency>
          <groupId>ch.qos.logback</groupId>
          <artifactId>logback-access</artifactId>
           <version>${logback.version}</version>
</dependency>
<dependency>
     <groupId>org.logback-extensions</groupId>
     <artifactId>logback-ext-spring</artifactId>
     <version>0.1.2</version>
</dependency>           

<exclusion>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
</exclusion>
<exclusion>
    <groupId>commons-logging</groupId>
     <artifactId>commons-logging</artifactId>
</exclusion>           

  1. 當然大家在對自己的應用進行了相應的日志方案內建之後,最好也要在web.xml中配置日志的初始化的listener;
  2. 如果大家按照上面的方案對自己應用的日志系統進行了改造,你會發現,在應用啟動的過程中,再也不會出現與日志系統本身內建相關的錯誤,更不會出現日志打不出來的現象,整個應用中日志列印出來是非常的幹淨;
  3. 當然統一日志內建不僅隻有log4j和logback方案,還有其它方案,其它方案詳見slf4j官方網站,位址連結是: https://www.slf4j.org/
  4. 因為logback日志比log4j更新,寫日志的效率更高,更友好、更穩定,建議大家有時間統一把自己的應用日志系統切換到logback,log4j日志轉換到logback 日志也是非常友善的,隻需要按上面的要求替換相關的maven依賴,然後用logback官方的轉換工具把log4j.propertiea配置檔案轉換成logback.xml的配置檔案,如果是log4j.xml檔案,轉換到logback.xml更容易,隻需要替換相關的appender即可,位址: https://logback.qos.ch/translator/