參考博客: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"; } }