slf4j和log4j2使用


1. slf4j和log4j2

  slf4j是一個日志接口,不能直接使用,需要結合具體的日志實現框架使用(log4j、logback、log4j2等)。

1.1 為什么不直接使用具體的實現,而需要使用日志接口

  接口定義了一種日志規范,可以有不同的日志實現,使用時只需面對接口(使用的也都是slf4j的包,沒有直接使用某個具體日志實現的包),因此在應用中可以隨意的更改的日志的實現框架,而不需要更改代碼中日志的相關代碼。簡而言之:就是只需更改日志實現的jar包即可,對用戶來說無直接影響,若業務代碼中直接使用具體的日志實現,當更改日志實現時,需要更改業務中日志相關的調用。

 

2 log4j2的配置文件

  主要包含Configuration、Appenders、Loggers、properties幾個屬性

2.1 Configuration屬性

  主要有status和monitorInterval等多個屬性。

  status: 用於控制log4j2框架本身的日志級別,例如可配置為:“trace”, “debug”, “info”, “warn”。

  monitorInterval: 每隔多少秒重新讀取配置文件,可以不重啟應用的情況下修改配置。類似於熱部署

2.2 Appenders屬性

  輸出源,定義日志輸出的地方。

  Console:將日志輸出至控制台

  File:將日志輸出至指定文件,需要配置文件路徑

  RollingRandomAccessFile:也是輸出至文件,不過支持當文件達到一定大小時,另起一個新文件寫入日志。   

    fileName 指定當前日志文件的位置和文件名稱
    filePattern 指定當發生Rolling時,文件的轉移和重命名規則
    SizeBasedTriggeringPolicy 指定當文件體積大於size指定的值時,觸發Rolling
    DefaultRolloverStrategy 指定最多保存的文件個數
    TimeBasedTriggeringPolicy 這個配置需要和filePattern結合使用,注意filePattern中配置的文件重命名規則是${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i,最小的時間粒度是mm,即分鍾
    TimeBasedTriggeringPolicy指定的size是1,結合起來就是每1分鍾生成一個新文件。如果改成%d{yyyy-MM-dd HH},最小粒度為小時,則每一個小時生成一個文件

  Async:異步,需要通過AppenderRef來指定要對哪種輸出源進行異步(一般用於配置RollingRandomAccessFile)

2.3 Loggers屬性

  name可以輸入包名,可以按照不同的包路徑輸出到不同文件中

  level:什么級別的日志可以輸出

  additivity: 是否繼承,若為true,父類的logger對應的輸出文件也會輸出一遍日志,一般設置為false

<Logger name="rollingRandomAccessFileLogger" level="trace" additivity="true">  
    <AppenderRef ref="RollingRandomAccessFile" />  
</Logger>

2.4 properties屬性

  使用來定義常量,以便在其他配置的時候引用,該配置是可選的

 

3 log4j2 案例

<?xml version="1.0" encoding="utf-8"?>
<!-- 根路徑 --> <configuration status="WARN" packages="org.apache.logging.log4j.core.pattern"> <properties> <!-- 定義文件輸出格式,后面可以直接引用,避免重復書寫格式 --> <property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} |-%-5level [%thread] %c [%L] -| %msg%n</property> </properties>
  <!-- 定義輸出的路徑 --> <appenders> <Console name="CONSOLE" target="system_out"> <PatternLayout pattern="${PATTERN}" /> </Console> <RollingFile name="TraceLog" fileName="logs/TraceLog.log" filePattern="logs/TraceLog-$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz"> <PatternLayout pattern="%msg%n" /> <Policies> <TimeBasedTriggeringPolicy /> <SizeBasedTriggeringPolicy size="250 MB" /> </Policies> </RollingFile> <Async name="AsyncTraceLog"> <AppenderRef ref="TraceLog" /> </Async> <Async name="AsyncCONSOLE"> <AppenderRef ref="CONSOLE" /> </Async> </appenders>   
  
  <!-- 按照不同的包路徑和日志文件路徑關聯在一起 --> <loggers> <AsyncLogger name="com.log.broker" level="info" additivity="false"> <AppenderRef ref="AsyncCONSOLE" /> </AsyncLogger> <Logger name="com.log.trace" level="info" additivity="false"> <AppenderRef ref="AsyncTraceLog" /> </Logger> <root level="info"> <AppenderRef ref="AsyncCONSOLE" /> </root> </loggers> </configuration>

  文件路徑一些常用的占位符:

  %d{HH:mm:ss.SSS} 表示輸出到毫秒的時間
  %t 輸出當前線程名稱
  %-5level 輸出日志級別,-5表示左對齊並且固定輸出5個字符,如果不足在右邊補0%msg 日志文本
  %n 換行

  其他常用的占位符有:
  %F 輸出所在的類文件名,如Log4j2Test.java
  %L 輸出行號
  %M 輸出所在方法名
  %l 輸出語句所在的行數, 包括類名、方法名、文件名、行數

 

本文源於:https://blog.csdn.net/vbirdbest/article/details/71751835


免責聲明!

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



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