SpringBoot 日志问题整理总结

SpringBoot 日志—学习记录

按时间分割

下面演示,十分钟一次分割日志文件

1)、添加日志类

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
package com.decathlon.sfc.order.bff.core.config;

import ch.qos.logback.core.joran.spi.NoAutoStart;
import ch.qos.logback.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy;

/**
* 日志分割(在 logback-spring.xml 中使用)
*
* @author 陶攀峰
* @version 1.0
* @date 2020-12-24 10:18
*/
@NoAutoStart
public class FileNamePatternTimeBasedFileNamingAndTriggeringPolicy<E> extends DefaultTimeBasedFileNamingAndTriggeringPolicy<E> {

/**
* FileNamePattern:elklog/%d{yyyy-MM-dd_HH-mm}.log
* -> 按照【分钟】来分割
* FileNamePattern:elklog/%d{yyyy-MM-dd_HH-mm-ss}.log
* -> 按照【秒】来分割
*/
private Integer multiple = 1;

@Override
protected void computeNextCheck() {
nextCheck = rc.getEndOfNextNthPeriod(dateInCurrentPeriod, multiple).getTime();
}

public Integer getMultiple() {
return multiple;
}

public void setMultiple(Integer multiple) {
// 至少 1
if (multiple > 1) {
this.multiple = multiple;
}
}

}

2)、在文件src\main\resources\logback.xml中添加内容,只给出部分代码,全部详情参看文末

1
2
3
4
5
6
7
8
9
10
11
<appender name="logFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>elklog/%d{yyyy-MM-dd_HH-mm}.log</FileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="com.decathlon.sfc.order.bff.core.config.FileNamePatternTimeBasedFileNamingAndTriggeringPolicy">
<multiple>10</multiple>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>{"@timestamp": "%d{yyyy-MM-dd'T'HH:mm:ss.SSS'Z'}", "logger_name": "%X{logger_name}","thread_name": "%thread","level": "%level", "instance_id": "%contextName", "module_name": "${appName}", "message": %marker%m%ex{full}, "uuid": "%X{uuid}"} %n</pattern>
</encoder>
</appender>

按大小分割

文件最大 5MB,3天后系统会自动删除日志文件。(可以调整 Windows 系统时间来测试)

不需要自己写任何类,添加如下配置即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
<appender name="logFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<Prudent>true</Prudent>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 一天一个日志文件 -->
<fileNamePattern>elklog/sfc_order_bff_${HOSTNAME}_%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>5MB</maxFileSize> <!-- 日志最大尺寸,日志文件过大会使的编辑器打开非常慢 -->
<maxHistory>3</maxHistory> <!-- 保存3天 -->
<totalSizeCap>2GB</totalSizeCap> <!-- 总日志大小 -->
</rollingPolicy>
<encoder>
<pattern>{"@timestamp": "%d{yyyy-MM-dd'T'HH:mm:ss.SSS'Z'}", "logger_name": "%X{logger_name}","thread_name": "%thread","level": "%level", "instance_id": "%contextName", "module_name": "${appName}", "message": %marker%m%ex{full}, "uuid": "%X{uuid}"} %n</pattern>
</encoder>
</appender>

关闭日志

在这里插入图片描述

AOP 抽取日志

参考:SpringBoot 使用 AOP 来抽取日志

我现在的配置

现在我是按照大小来分割,日志文件最多保存3天就会自己删除掉。

问:为什么日志名用 ${HOSTNAME} ?
答:因为我的项目是跑在 docker 上面的,多台分布式的应用在跑,再通过 azcopy 把文件上传到 Azure blob 上面,通过 elk 来抽取 blob 数据,所以我使用了容器名来区分同天的日志文件。

logback-spring.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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<contextName>${HOSTNAME}</contextName>
<springProperty scope="context" name="appName" source="spring.application.name"/>

<springProfile name="local">
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p [%-31t] [%-54logger{0}] %marker%m%ex{full} %X{correlationId} - %logger - %F:%L%n</pattern>
</layout>
</appender>

<appender name="logFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<Prudent>true</Prudent>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 一天一个日志文件 -->
<fileNamePattern>elklog/sfc_order_bff_${HOSTNAME}_%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>5MB</maxFileSize> <!-- 日志最大尺寸,日志文件过大会使的编辑器打开非常慢 -->
<maxHistory>3</maxHistory> <!-- 保存3天 -->
<totalSizeCap>2GB</totalSizeCap> <!-- 总日志大小 -->
</rollingPolicy>
<!--<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">-->
<!-- <FileNamePattern>elklog/%d{yyyy-MM-dd_HH-mm}.log</FileNamePattern>-->
<!-- <timeBasedFileNamingAndTriggeringPolicy class="com.decathlon.sfc.order.bff.core.config.FileNamePatternTimeBasedFileNamingAndTriggeringPolicy">-->
<!-- <multiple>10</multiple>-->
<!-- </timeBasedFileNamingAndTriggeringPolicy>-->
<!--</rollingPolicy>-->
<encoder>
<pattern>{"@timestamp": "%d{yyyy-MM-dd'T'HH:mm:ss.SSS'Z'}", "logger_name": "%X{logger_name}","thread_name": "%thread","level": "%level", "instance_id": "%contextName", "module_name": "${appName}", "message": %marker%m%ex{full}, "uuid": "%X{uuid}"} %n</pattern>
</encoder>
</appender>

<logger name="com.decathlon.sfc.order.bff.core.aspect" additivity="false">
<appender-ref ref="logFileAppender"/>
</logger>

<logger name="org" level="off"/>
<logger name="org.springframework.boot.web.embedded.tomcat.TomcatWebServer" level="info"/>
<logger name="springfox" level="off"/>
<logger name="com.jd" level="off"/>
<root level="INFO">
<appender-ref ref="consoleAppender"/>
</root>
</springProfile>

<springProfile name="preprod">
<!--<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">-->
<!-- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">-->
<!-- <level>DEBUG</level>-->
<!-- </filter>-->
<!-- <layout class="ch.qos.logback.classic.PatternLayout">-->
<!-- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p [%-31t] [%-54logger{0}] %marker%m%ex{full} %X{correlationId} - %logger - %F:%L%n</pattern>-->
<!-- </layout>-->
<!--</appender>-->

<appender name="consolelogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<Prudent>true</Prudent>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>consolelog/%d{yyyy-MM-dd}.log</FileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p [%-31t] [%-54logger{0}] %marker%m%ex{full} %X{correlationId} - %logger - %F:%L%n</pattern>
</encoder>
</appender>

<appender name="logFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<Prudent>true</Prudent>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 一天一个日志文件 -->
<fileNamePattern>elklog/sfc_order_bff_${HOSTNAME}_%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>5MB</maxFileSize> <!-- 日志最大尺寸,日志文件过大会使的编辑器打开非常慢 -->
<maxHistory>3</maxHistory> <!-- 保存3天 -->
<totalSizeCap>2GB</totalSizeCap> <!-- 总日志大小 -->
</rollingPolicy>
<!--<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">-->
<!-- <FileNamePattern>elklog/%d{yyyy-MM-dd_HH-mm}.log</FileNamePattern>-->
<!-- <timeBasedFileNamingAndTriggeringPolicy class="com.decathlon.sfc.order.bff.core.config.FileNamePatternTimeBasedFileNamingAndTriggeringPolicy">-->
<!-- <multiple>10</multiple>-->
<!-- </timeBasedFileNamingAndTriggeringPolicy>-->
<!--</rollingPolicy>-->
<encoder>
<pattern>{"@timestamp": "%d{yyyy-MM-dd'T'HH:mm:ss.SSS'Z'}", "logger_name": "%X{logger_name}","thread_name": "%thread","level": "%level", "instance_id": "%contextName", "module_name": "${appName}", "message": %marker%m%ex{full}, "uuid": "%X{uuid}"} %n</pattern>
</encoder>
</appender>

<logger name="com.decathlon.sfc.order.bff.core.aspect" additivity="false">
<appender-ref ref="logFileAppender"/>
</logger>

<logger name="org" level="off"/>
<logger name="org.springframework.boot.web.embedded.tomcat.TomcatWebServer" level="info"/>
<logger name="springfox" level="off"/>
<logger name="com.jd" level="off"/>
<root level="INFO">
<!--<appender-ref ref="consoleAppender"/>-->
<appender-ref ref="consolelogAppender"/>
</root>
</springProfile>

<springProfile name="production">
<!--<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">-->
<!-- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">-->
<!-- <level>DEBUG</level>-->
<!-- </filter>-->
<!-- <layout class="ch.qos.logback.classic.PatternLayout">-->
<!-- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p [%-31t] [%-54logger{0}] %marker%m%ex{full} %X{correlationId} - %logger - %F:%L%n</pattern>-->
<!-- </layout>-->
<!--</appender>-->

<appender name="consolelogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<Prudent>true</Prudent>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>consolelog/%d{yyyy-MM-dd}.log</FileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p [%-31t] [%-54logger{0}] %marker%m%ex{full} %X{correlationId} - %logger - %F:%L%n</pattern>
</encoder>
</appender>

<appender name="logFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<Prudent>true</Prudent>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 一天一个日志文件 -->
<fileNamePattern>elklog/sfc_order_bff_${HOSTNAME}_%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>5MB</maxFileSize> <!-- 日志最大尺寸,日志文件过大会使的编辑器打开非常慢 -->
<maxHistory>3</maxHistory> <!-- 保存3天 -->
<totalSizeCap>2GB</totalSizeCap> <!-- 总日志大小 -->
</rollingPolicy>
<!--<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">-->
<!-- <FileNamePattern>elklog/%d{yyyy-MM-dd_HH-mm}.log</FileNamePattern>-->
<!-- <timeBasedFileNamingAndTriggeringPolicy class="com.decathlon.sfc.order.bff.core.config.FileNamePatternTimeBasedFileNamingAndTriggeringPolicy">-->
<!-- <multiple>10</multiple>-->
<!-- </timeBasedFileNamingAndTriggeringPolicy>-->
<!--</rollingPolicy>-->
<encoder>
<pattern>{"@timestamp": "%d{yyyy-MM-dd'T'HH:mm:ss.SSS'Z'}", "logger_name": "%X{logger_name}","thread_name": "%thread","level": "%level", "instance_id": "%contextName", "module_name": "${appName}", "message": %marker%m%ex{full}, "uuid": "%X{uuid}"} %n</pattern>
</encoder>
</appender>

<logger name="com.decathlon.sfc.order.bff.core.aspect" additivity="false">
<appender-ref ref="logFileAppender"/>
</logger>

<logger name="org" level="off"/>
<logger name="org.springframework.boot.web.embedded.tomcat.TomcatWebServer" level="info"/>
<logger name="springfox" level="off"/>
<logger name="com.jd" level="off"/>
<root level="INFO">
<!--<appender-ref ref="consoleAppender"/>-->
<appender-ref ref="consolelogAppender"/>
</root>
</springProfile>

</configuration>