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