由于本人技術有限, 沒有弄清楚為什么選擇日志框架優先使用 log4j2, 我也一樣是是通過其他博主的文章中的壓力測驗報告發現 log4j2 的異步輸出方式遠高于 spring boot 自帶的 logback, 不過不管是 logback, 還是 log4j2 它們的作者都是同一人.
這里還提一下 slf4j, 它是一個經典的門面模式的框架 (如 jdbc), 就是一套介面定義, 不負責具體的實作. 所以一般組合就是 slf4j + 日志列印驅動框架了.
匯入 spring boot + log4j2 依賴, spring-boot-starter-web 里面是有依賴 spring-boot-starter 的.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!-- spring boot 默認使用 slf4j + logback, 不排除這個依賴默認還是用的自帶的 logback -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
創建組態檔 log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--日志級別以及優先級排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,這個用于設定log4j2自身內部的資訊輸出,可以不設定,當設定成trace時,你會看到log4j2內部各種詳細輸出-->
<!--monitorInterval:Log4j能夠自動檢測修改配置 檔案和重新配置本身,設定間隔秒數-->
<configuration status="INFO" monitorInterval="30">
<properties>
<!--日志格式, %X 取執行緒相關聯的NDC, NDC物件里面是存了請求的堆疊資訊的, 可以借助它取請求引數里面的變數-->
<property name="LOG_CONVERSION_PATTERN" value="https://www.cnblogs.com/strive-sn/p/%d -[%p] [%X{sessionId}] %c:L%L - %m%n"/>
<!--單個日志檔案大小-->
<property name="MAX_FILE_SIZE" value="https://www.cnblogs.com/strive-sn/p/100MB"/>
<!--日志保存時間-->
<property name="MAX_HISTORY" value="https://www.cnblogs.com/strive-sn/p/P60D"/>
<!--日志根路徑-->
<property name="BASE_LOG_PATH" value="https://www.cnblogs.com/strive-sn/p/logs"/>
<!--日志應用名,${sys:application_name}是系統變數中配置的, 如vm中配置-Dapplication_name="xxx"-->
<property name="SERVER_NAME" value="https://www.cnblogs.com/strive-sn/p/${sys:application_name}"/>
</properties>
<!--先定義所有的appender-->
<appenders>
<!--這個輸出控制臺的配置-->
<console name="Console" target="SYSTEM_OUT">
<!--輸出level及以上級別的資訊(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<!--輸出日志的格式-->
<PatternLayout pattern="${LOG_CONVERSION_PATTERN}"/>
</console>
<!--檔案會列印出所有資訊,這個log每次運行程式會自動清空,由append屬性決定,這個也挺有用的,適合臨時測驗用-->
<File name="log" fileName="${BASE_LOG_PATH}/${SERVER_NAME}/catalina.out" append="false">
<PatternLayout pattern="${LOG_CONVERSION_PATTERN}"/>
</File>
<!-- 這個會列印出所有的info及以上級別的資訊,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的檔案夾下面并進行壓縮,作為存檔-->
<RollingFile name="RollingFile" fileName="${BASE_LOG_PATH}/${SERVER_NAME}/logs/info.log"
filePattern="${BASE_LOG_PATH}/${SERVER_NAME}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz">
<!--輸出level及以上級別的資訊(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_CONVERSION_PATTERN}"/>
<Policies>
<!-- 按天打包日志 -->
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
<!-- 配合上一個配置, 表示當日滿 100M 再打包一次 -->
<SizeBasedTriggeringPolicy size="${MAX_FILE_SIZE}"/>
</Policies>
<DefaultRolloverStrategy>
<!-- 配置洗掉日志檔案的周期, maxDepth 為檔案深度, IfFileName 配置會被洗掉的檔案后綴 -->
<Delete basePath="${BASE_LOG_PATH}/${SERVER_NAME}/logs" maxDepth="2">
<IfFileName glob="*/*.log.gz"/>
<IfLastModified age="${MAX_HISTORY}" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</appenders>
<!--然后定義logger,只有定義了logger并引入的appender,appender才會生效-->
<loggers>
<!--過濾掉spring和mybatis的一些無用的DEBUG資訊-->
<!--<logger name="org.springframework" level="INFO"></logger>
<logger name="org.mybatis" level="INFO"></logger>-->
<root level="all">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFile"/>
</root>
</loggers>
</configuration>
獲取日志輸入物件方式1:
private static Logger log = LoggerFactory.getLogger(XXX.class)
方式2, 需要匯入 lombok 的依賴:
@Log4j2 //還可以使用@slf4j
public class XXX
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/445864.html
標籤:Java
