公司有個項目,需要和幾個第三方系統對接。這種項目,日志一定要記錄詳細,不然出了問題就是各種甩鍋。雖然項目里面和第三方系統對接相關的業務記錄的日志很詳細,但是由於整個項目的日志都在一個文件中,排查問題時比較麻煩。因此希望可以把這些和第三方對接的日志生成在另外一個單獨的文件。這也就是標題中的實現按業務輸出日志到不同的文件,下面開始講解具體的實現方案。
一、方案
由於需要按業務生成不同的日志文件,看到按業務來區分,我的第一感覺就是業務其實是可以按包名來區分的。所以其實我們只要實現不同的包下面的日志輸出到不同的文件,就能實現需求了。
由於本人以前玩過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-->
<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>
<!--官方配置 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.jwx.digital.client.haier.http" additivity="false" level="debug">
<!-- 引用自定義的appender -->
<appender-ref ref="Biz_LOG"/>
<!-- 這里也引用控制台appender,才能在控制台中看到我們的日志 -->
<appender-ref ref="CONSOLE"/>
</logger>
<!--######自定義配置 end########-->
</configuration>
1
2
3
<configuration>
4
5
<!--官方配置 start-->
6
<!--保留官方配置,方便使用官方配置的特性,參考:spring-boot-2.1.0.RELEASE.jar!\org\springframework\boot\logging\logback\base.xml-->
7
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
8
<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
9
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
10
<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
11
<root level="info">
12
<appender-ref ref="CONSOLE" />
13
<appender-ref ref="FILE" />
14
</root>
15
<!--官方配置 end-->
16
17
<!--######自定義配置 start########-->
18
<!-- 自定義配置__單獨輸出到一個日志文件中 -->
19
<appender name="Biz_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
20
<encoder>
21
<pattern>${FILE_LOG_PATTERN}</pattern>
22
</encoder>
23
<file>${LOG_FILE}_BIZ.log</file>
24
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
25
<fileNamePattern>${LOG_FILE}_BIZ.%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
26
<maxFileSize>${LOG_FILE_MAX_SIZE:-10MB}</maxFileSize>
27
<maxHistory>${LOG_FILE_MAX_HISTORY:-0}</maxHistory>
28
</rollingPolicy>
29
</appender>
30
31
<!--指定包或者類的日志配置(這里是局部配置,它能覆蓋全局配置)-->
32
<!-- 自定義配置__配置業務日志輸出至單獨的日志文件中 -->
33
<logger name="com.jwx.digital.client.haier.http" additivity="false" level="debug">
34
<!-- 引用自定義的appender -->
35
<appender-ref ref="Biz_LOG"/>
36
<!-- 這里也引用控制台appender,才能在控制台中看到我們的日志 -->
37
<appender-ref ref="CONSOLE"/>
38
</logger>
39
40
<!--######自定義配置 end########-->
41
42
</configuration>
(3)驗證階段
項目的application.yml對日志做了如下配置
# 日志打印
logging:
file: /log/digital-client.log #日志輸出到這個文件
1
# 日志打印
2
logging
3
file /log/digital-client.log #日志輸出到這個文件
項目運行后,我們在digital-client.log的旁邊發現了一個digital-client.log_BIZ.log的文件,而且文件里面的內容就是我們那個第三方對接的業務日志。
三、小結
(1)其實要實現這個功能有其他方案,但是根據當前項目的運行環境,以及代碼的結構,這種修改日志配置的方式是最簡單的
(2)通過這次的日志配置,學習了springboot日志logback的默認xml配置