站長資訊網
        最全最豐富的資訊網站

        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");      }  }
        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 国产偷亚洲偷欧美偷精品| 国产精品青草视频免费播放| 久久青青草原国产精品免费| 亚洲国产精品人人做人人爱| 99久久er这里只有精品18 | 精品国产乱码久久久久久1区2区 | 日韩精品无码一区二区中文字幕 | 伊人久久综合精品无码AV专区 | 无码日韩精品一区二区免费暖暖 | 精品欧美| 国产AⅤ精品一区二区三区久久 | 国产夫妇精品自在线| 欧美精品一区二区蜜臀亚洲| 亚洲精品国产自在久久| 精品国产爽爽AV| 国产伦精品一区二区三区视频猫咪 | 日韩熟女精品一区二区三区| 国产精品自在在线午夜福利 | 欧美精品hdvideosex4k| 中文字幕无码久久精品青草| 污污网站国产精品白丝袜| 久久精品国产亚洲av瑜伽| 99热日韩这里只有精品| 国产精品嫩草影院一二三区入口| 国产精品无码久久综合| 精品国偷自产在线| 国产精品无码无卡在线播放| 国产女人精品视频国产灰线| 国产精品女同一区二区| 2022精品天堂在线视频| 成人国产精品高清在线观看| 国产成人亚洲合集青青草原精品| 韩国精品欧美一区二区三区 | 国产高清精品一区| 国产精品99久久久久久宅男| 国产伦精品一区二区三区视频金莲| 国产亚洲精品不卡在线| 久久精品成人欧美大片| 久久这里有精品视频| 亚洲国产成人a精品不卡在线| 久久久久国产精品三级网|