原文地址:https://www.cnblogs.com/zeng1994/p/f9bff238b13a0bf8fb8bf88c41db7a34.html
以下內容已經過實踐,勘誤,總結
環境:Springboot2.5.2
公司有個項目,需要和幾個第三方系統對接。這種項目,日志一定要記錄詳細,不然出了問題就是各種甩鍋。雖然項目里面和第三方系統對接相關的業務記錄的日志很詳細,但是由于整個項目的日志都在一個文件中,排查問題時比較麻煩。因此希望可以把這些和第三方對接的日志生成在另外一個單獨的文件。這也就是標題中的實現按業務輸出日志到不同的文件,下面開始講解具體的實現方案。
一、方案
由于需要按業務生成不同的日志文件,看到按業務來區分,我的第一感覺就是業務其實是可以按包名來區分的。所以其實我們只要實現不同的包下面的日志輸出到不同的文件,就能實現需求了。由于本人以前玩過log4j2,要實現這個還是不難的,所以馬上就有思路了。
具體的實現思路如下:
(1)自定義一個輸出到文件的appender(理解為日志輸出器)
(2)配置logger,logger的name為需要單獨生成文件的那個包的全包名,然后在里面引用上面定義的appender
二、具體實現
(1)準備階段
由于項目采用SpringBoot框架,而且使用的是默認日志框架logback。看了下官網,只需要在resources下面定義一個logback-spring.xml的XML文件就能覆蓋默認的logback配置。
由于SpringBoot默認的日志配置還是挺不錯的,因此想把默認的配置保留下來。通過查看springboot的jar包才找到默認的logback的xml配置。
它的位置為spring-boot-2.1.0.RELEASE.jar!\org\springframework\boot\logging\logback\base.xml,這個默認xml中有如下配置:
定義了2個appender,分別為輸出到控制臺的appender和輸出到文件的appender
默認日志級別為info,默認引用了上面定義的這個2個appender
(2)實戰階段
在resources目錄下新建一個logback-spring.xml的文件
將logback的默認配置(base.xml)內容copy到我們的xml文件中,因為我們想保留它的默認配置
定義一個輸出到文件的appender
定義一個logger,logger的name為需要單獨生成文件的那個包的全包名
logger里面引用我們上面定義的appender
這里特別說明,自定義logger是屬于局部配置,它的優先級高于全局配置(指root),可以理解為局部配置覆蓋全局配置。
代碼如下
logback-spring.xml內容具體如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration><!--官方配置 start--><!--保留官方配置,方便使用官方配置的特性,參考:spring-boot-2.1.0.RELEASE.jar!\org\springframework\boot\logging\logback\base.xml--><!--<included>--><include resource="org/springframework/boot/logging/logback/defaults.xml"/><property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/><include resource="org/springframework/boot/logging/logback/console-appender.xml"/><include resource="org/springframework/boot/logging/logback/file-appender.xml"/><root level="INFO"><appender-ref ref="CONSOLE"/><appender-ref ref="FILE"/></root><!--</included>--><!--官方配置 end--><!--######自定義配置 start########--><!-- 自定義配置__單獨輸出到一個日志文件中 --><appender name="Biz_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender"><encoder><pattern>${FILE_LOG_PATTERN}</pattern></encoder><file>${LOG_FILE}_BIZ.log</file><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${LOG_FILE}_BIZ.%d{yyyy-MM-dd}.%i.gz</fileNamePattern><maxFileSize>${LOG_FILE_MAX_SIZE:-10MB}</maxFileSize><maxHistory>${LOG_FILE_MAX_HISTORY:-0}</maxHistory></rollingPolicy></appender><!--指定包或者類的日志配置(這里是局部配置,它能覆蓋全局配置)--><!-- 自定義配置__配置業務日志輸出至單獨的日志文件中 --><logger name="com.huicoo.forestry.resources.manager.ImportManager" additivity="false" level="debug"><!-- 引用自定義的appender --><appender-ref ref="Biz_LOG"/><!-- 這里也引用控制臺appender,才能在控制臺中看到我們的日志 --><appender-ref ref="CONSOLE"/></logger><!--######自定義配置 end########-->
</configuration>
最終實現日志單獨打印到指定的_biz.log文件中