SpringBoot日志详解使用include

一、介绍

前段时间,公司让我整改SpringBoot日志的配置,我改的老痛苦了。

一共有7个微服务,其中每一个微服务各自都有4个这样logback-spring-{active}.xml文件。

正好我看过SpringBoot中是怎么写的,给大家截图看下

image-20240203151540777

既然如此,我们也可以通过include标签来进行编写。


哦对了,SpringBoot使用的logback日志,里面的含义代表什么,我就不详细讲了。

具体可以看我的这边文章,SpringBoot日志配置详情 | 半月无霜 (banmoon.top)

二、配置

这边创建两份基础文件,分别是

  • banmoon-logback-defined.xml:里面定义了一些参数

  • banmoon-logback-append.xml:里面定义了一些输出

  • banmoon-logback.xml:将上面的两个文件引入整合,并加上了一些日志等级的配置

看看文件所在的目录,都在scr/main/java的包内

image-20240203153406212

1)banmoon-logback-defined.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8"?>
<included>
<!-- 获取该应用的名称 -->
<springProperty scope="context" name="APPLICATION_NAME" source="spring.application.name"/>

<!-- 定义日志输出的路径 -->
<springProperty scope="context" name="LOG_PATH_SPRING" source="logging.path"/>
<if condition='isNull("LOG_PATH_SPRING")'>
<then>
<property name="LOG_PATH" value="./logs/${APPLICATION_NAME}"/>
</then>
<else>
<property name="LOG_PATH" value="${LOG_PATH_SPRING}"/>
</else>
</if>

<!-- 定义日志输出格式和颜色 -->
<property name="LOG_FORMAT_ONE" value="%red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %blue([%-5level]) %cyan(%logger{36}:%line) %msg%n"/>
<property name="LOG_FORMAT_TWO" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5level] %logger{36}:%line %msg%n"/>

</included>

2)banmoon-logback-append.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?xml version="1.0" encoding="UTF-8"?>
<included>
<!-- 输出到控制台 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!-- 日志输出编码格式化 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>${LOG_FORMAT_ONE}</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>

<!-- 时间日期滚动日志 -->
<appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 输出的日志远程,当天的日志名称 -->
<file>${LOG_PATH}/info.log</file>
<!-- 策略配置 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 保存归纳的日志 -->
<fileNamePattern>${LOG_PATH}/%d{yyyy-MM-dd}/info_%i.log</fileNamePattern>
<!-- 日志文件最大尺寸 -->
<maxFileSize>10MB</maxFileSize>
<!--日志文件保留天数-->
<MaxHistory>5</MaxHistory>
</rollingPolicy>
<!-- 日志输出编码格式化 -->
<encoder>
<pattern>${LOG_FORMAT_TWO}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>

<!-- 时间日期滚动日志,只记录error级别的日志 -->
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 输出的日志远程,当天的日志名称 -->
<file>${LOG_PATH}/error.log</file>
<!-- 策略配置 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 保存归纳的日志 -->
<fileNamePattern>${LOG_PATH}/%d{yyyy-MM-dd}/error_%i.log</fileNamePattern>
<!-- 日志文件最大尺寸 -->
<maxFileSize>10MB</maxFileSize>
<!--日志文件保留天数-->
<MaxHistory>5</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>${LOG_FORMAT_TWO}</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 过滤器,日志级别过滤,仅输出error日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>

<!-- 指定输出的日志等级,root代表工程所有包 -->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE_INFO"/>
<appender-ref ref="FILE_ERROR"/>
</root>

<!-- 指定输出的日志等级,指定包路径,此包下都以设置的等级输出 -->
<!-- additivity表示日志是否向上传递,如果为true,日志在root可能会再次打印 -->
<logger name="com.banmoon.**.mapper" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE_INFO"/>
</logger>

</included>

3)banmoon-logback.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="UTF-8"?>
<included>
<!-- 引入定义参数 -->
<include resource="com/banmoon/logging/banmoon-logback-defined.xml"/>

<!-- 引入日志输出定义 -->
<include resource="com/banmoon/logging/banmoon-logback-append.xml"/>

<!-- 本地环境,开发环境,测试环境 -->
<springProfile name="local | dev | test">
<logger name="com.banmoon" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE_INFO"/>
</logger>
</springProfile>

<!-- 生产环境 -->
<springProfile name="prod">
<logger name="com.banmoon" level="INFO" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE_INFO"/>
</logger>
</springProfile>

</included>

4)还有几点要说明的

  1. 由于我放的位置在scr/main/java中,注意maven编译后,文件还存不存在

  2. 上面这三份文件的root标签,是included

  3. 还没有结束,我们要在SpringBoot项目中用起来,可以这样引入
    image-20240203155651441

    1
    2
    3
    4
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration scan="true" scanPeriod="30 seconds" debug="false">
    <include resource="com/banmoon/logging/banmoon-logback.xml"/>
    </configuration>
  4. 由于banmoon-logback-defined.xml中使用了if标签,请确保引入了下面这个依赖

    1
    2
    3
    4
    <dependency>
    <groupId>org.codehaus.janino</groupId>
    <artifactId>janino</artifactId>
    </dependency>

上面的设置好了后,我们就可以正常使用了

三、最后

遇到了很多性格的人,但又有什么用呢?

我是半月,你我一同共勉!!!