參考博客:Springboot整合log4j2日志全解 - 上帝愛吃蘋果-Soochow - 博客園 (cnblogs.com)
這個是看到的比較詳細的 然后我個人的配置測試也基本上是按照上面這個來實現的 下面只是加入了個人的一點算多余的注解而已
Spring boot引入依賴 版本號可以自行修改
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>2.2.4.RELEASE</version>
</dependency>
application.properties 配置:
logging.config=classpath:log4j2-spring.xml
application.yml配置:
logging:
config: xxxx.xml
level:
cn.jay.repository: trace
然后就是配置文件 這個沒啥好說的 上面的博客基本上說的很清楚 我只是在細節上做了點很小白的補充
log4j2-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 設置log4j2的自身log級別為warn -->
<!-- OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!-- status用來指定log4j本身的打印日志的級別 monitorinterval用於指定log4j自動重新配置的監測間隔時間,單位是s,最小是5s-->
<configuration status="info" monitorInterval="30">
<!--變量配置-->
<Properties>
<!-- 格式化輸出:%date表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度 %msg:日志消息,%n是換行符-->
<!-- %logger{36} 表示 Logger 名字最長36個字符 -->
<property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
<!-- 定義日志存儲的路徑 -->
<property name="FILE_PATH" value="log" />
<!--如果是單個項目的話 這層可以去掉 然后將下面生成壓縮包的路徑改下-->
<property name="FILE_NAME" value="項目名" />
</Properties>
<!--File節點用來定義輸出到指定位置的文件的Appender.-->
<!--Console節點用來定義輸出到控制台的Appender.-->
<!--RollingFile節點用來定義超過指定大小自動刪除舊的創建新的的Appender.-->
<Appenders>
<!--這個輸出控制台的配置-->
<Console name="Console" target="SYSTEM_OUT">
<!--輸出日志的格式-->
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<!--控制台只輸出level及其以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Console>
<!--文件會打印出所有信息,這個log每次運行程序會自動清空,由append屬性決定,適合臨時測試用-->
<File name="log" fileName="${FILE_PATH}/test.log" append="false">
<PatternLayout pattern="${LOG_PATTERN}"/>
</File>
<!-- 這個會打印出所有的info及以下級別的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面並進行壓縮,作為存檔-->
<!--
壓縮規則 會按照設置的路徑生成一個壓縮包或者文件 %i指的是生成的數量 這個數字會從1開始
設置了DefaultRolloverStrategy max后 %i會獲取max的值以及已經生成的%i的最大值 然后進從第%i+1個進行生成
測試了一個小問題 只保留一個最大的%i的值的時候 不會生成前面的壓縮日志 非正常流程 不算bug
覆蓋策列 可以設置日期是當天的 那么在輸出日志達到設置的最大大小后 會生成壓縮文件 壓縮文件最大數量為設置的max 這樣子就是每天最大會容納多大的日志
如果日志文件壓縮包名稱定義的是每個月的 那輸出日志多的時候 就做好被覆蓋的准備
-->
<RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log"
filePattern="${FILE_PATH}/${FILE_NAME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz">
<!--控制台只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<!--interval屬性用來指定多久滾動一次,默認是1 hour-->
<TimeBasedTriggeringPolicy/>
<!--設置日志文件大小 超過后會按照上面設置的地址進行壓縮保存 源日志文件清空后重新寫入-->
<SizeBasedTriggeringPolicy size="20 MB"/>
</Policies>
<!-- DefaultRolloverStrategy屬性如不設置,則默認為最多同一文件夾下7個文件開始覆蓋 計數器 配合filePattern路徑中的%i使用-->
<DefaultRolloverStrategy max="20"/>
</RollingFile>
<RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log"
filePattern="${FILE_PATH}/${FILE_NAME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz">
<!--控制台只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="1 MB"/>
</Policies>
<!-- DefaultRolloverStrategy屬性如不設置,則默認為最多同一文件夾下7個文件開始覆蓋-->
<DefaultRolloverStrategy max="3"/>
</RollingFile>
</Appenders>
<loggers>
<!--Logger節點用來單獨指定日志的形式,比如要為指定包下的class指定不同的日志級別等。-->
<!--過濾掉spring和mybatis的一些無用的DEBUG信息-->
<logger name="org.springframework" level="INFO"></logger>
<logger name="org.mybatis" level="INFO"></logger>
<!-- <Root level="info"> level="all",執行以下是有的配置;level="info"執行info及以上的配置,哪怕debug配置了也不執行日志 -->
<!--Root節點用來指定項目的根日志,如果沒有單獨指定Logger,那么就會默認使用該Root日志輸出-->
<!--root里面appender-ref 設置的ref 會作為監聽指標 如果未設置在這個里面 那么就不會輸出日志文件-->
<root level="info">
<appender-ref ref="Console"/>
<appender-ref ref="log"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileError"/>
</root>
</loggers>
</configuration>
代碼實現:
@RestController @Slf4j @RequestMapping("/test") public class TestController { @RequestMapping("/demo") public String demo(){ System.out.println("處理請求中……"); log.error("Something else is wrong here"); return "ok"; } }
