前置条件:
jdk :17.0
springboot: 3.0.6
开始工作通过 springboot+initer 创建了 springboot3 的初始化版本。
github 地址为:https://github.com/huangxiaofeng10047/demo
改写 springboot3 支持 yml 配置做如下变更:
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
|
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!-- 切换log4j2日志读取 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 配置 log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- 加上这个才能辨认到log4j2.yml文件 -->
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>8.5.0</version>
</dependency>
|
log4j2,.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
|
# 共有8个级别,按照从低到高为:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF。
# intLevel值依次为0,100,200,300,400,500,600,700
# intLevel 值越小,级别越高
Configuration:
#日志框架本身的输出日志级别
status: WARN
#自动加载配置文件的间隔时间,不低于5秒
monitorInterval: 5
Properties: # 定义全局变量
Property: # 缺省配置(用于开发环境)。其他环境需要在VM参数中指定,如下:
#测试:-Dlog.level.console=warn -Dlog.level.xjj=trace
#生产:-Dlog.level.console=warn -Dlog.level.xjj=info
- name: log.level.console
value: info
- name: log.path
value: ./${project.name}_log
- name: project.name
value: daily
- name: log.pattern
value: '%d{yyyy-MM-dd HH:mm:ss.SSS} -%5p [%traceId] ${PID:-} [%15.15t] %-30.30C{1.} : %m%n'
Appenders:
Console: #输出到控制台
name: CONSOLE
target: SYSTEM_OUT
PatternLayout: #日志消息格式
pattern: ${log.pattern}
# 启动日志
RollingFile:
- name: ROLLING_FILE
fileName: ${log.path}/daily/${project.name}.log #输出文件的地址
filePattern: '${log.path}/daily/$${date:yyyy-MM-dd}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz' #文件生成规则
PatternLayout:
pattern: ${log.pattern}
Filters:
# 一定要先去除不接受的日志级别,然后获取需要接受的日志级别
ThresholdFilter: # 日志级别过滤器
- level: error # 日志级别
onMatch: DENY # 高于的拒绝
onMismatch: NEUTRAL # 低于的
- level: info
onMatch: ACCEPT
onMismatch: DENY
Policies:
SizeBasedTriggeringPolicy: # 日志拆分规则
size: '10MB'
TimeBasedTriggeringPolicy: # 按天分类
modulate: true
interval: 1
DefaultRolloverStrategy: # 单目录下,文件最多20个,超过会删除最早之前的
max: 20
# 错误日志
- name: EXCEPTION_ROLLING_FILE
ignoreExceptions: false
fileName: ${log.path}/exception/${project.name}_exception.log
filePattern: '${log.path}/exception/$${date:yyyy-MM-dd}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz'
ThresholdFilter:
level: error
#onMatch="ACCEPT" 匹配该级别及以上
#onMatch="DENY" 不匹配该级别及以上
#onMismatch="ACCEPT" 表示匹配该级别以下的级别
#onMismatch="DENY" 不表示匹配该级别以下的级别
onMatch: ACCEPT
onMismatch: DENY
PatternLayout:
pattern: ${log.pattern}
Policies:
SizeBasedTriggeringPolicy: # 日志拆分规则
size: '10MB'
TimeBasedTriggeringPolicy: # 按天分类
modulate: true
interval: 1
DefaultRolloverStrategy: # 文件最多100个
max: 100
# 警告日志
- name: WARN_ROLLING_FILE
ignoreExceptions: false
fileName: ${log.path}/warn/${project.name}_warn.log
filePattern: '${log.path}/warn/$${date:yyyy-MM-dd-dd}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz'
ThresholdFilter:
level: warn
#onMatch="ACCEPT" 匹配该级别及以上
#onMatch="DENY" 不匹配该级别及以上
#onMismatch="ACCEPT" 表示匹配该级别以下的级别
#onMismatch="DENY" 不表示匹配该级别以下的级别
onMatch: ACCEPT
onMismatch: DENY
PatternLayout:
pattern: ${log.pattern}
Policies:
SizeBasedTriggeringPolicy: # 日志拆分规则
size: '10MB'
TimeBasedTriggeringPolicy: # 按天分类
modulate: true
interval: 1
DefaultRolloverStrategy: # 文件最多100个
max: 20
# 用户行为日志
- name: ROLLING_FILE_USER
fileName: ${log.path}/user/user-${project.name}.log
filePattern: '${log.path}/user/$${date:yyyy-MM-dd}/user-${project.name}-%d{yyyy-MM-dd}-%i.log.gz'
PatternLayout:
pattern: ${log.pattern}
Filters:
# 一定要先去除不接受的日志级别,然后获取需要接受的日志级别
ThresholdFilter:
- level: error
onMatch: DENY
onMismatch: NEUTRAL
#onMismatch:NEUTRAL 交给下一个filter处理
- level: info
onMatch: ACCEPT
onMismatch: DENY
Policies:
SizeBasedTriggeringPolicy: # 日志拆分规则
size: '10MB'
TimeBasedTriggeringPolicy: # 按天分类
modulate: true
interval: 1
DefaultRolloverStrategy: # 文件最多100个
max: 100
Loggers:
Root:
# 共有8个级别,按照从低到高为:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF 选择all则输出全部的日志
level: info
AppenderRef:
- ref: CONSOLE
- ref: ROLLING_FILE
- ref: EXCEPTION_ROLLING_FILE
- ref: WARN_ROLLING_FILE
Logger:
- name: exception
level: debug
additivity: true #追加
AppenderRef:
- ref: EXCEPTION_ROLLING_FILE
#监听具体包下面的日志
# Logger: # 为com.xjj包配置特殊的Log级别,方便调试
- name: com.example.aspect
additivity: false
level: info
AppenderRef:
- ref: CONSOLE
- ref: ROLLING_FILE_USER
|
springboot.yml
1
2
3
4
5
6
7
|
server:
port: 8081
logging:
config: classpath:log4j2.yml
spring:
main:
lazy-initialization: true
|
再 idea 上使用,推荐使用 idea 的插件 grepConsole,可以自定义展示的颜色如下图所示
集成 skyworking
启动 docker 办 skyworking
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
|
mkdir -p /mnt/e/docker/es/config
mkdir -p /mnt/e/docker/es/data
chmod 777 -R /mnt/e/docker/es
vi /mnt/docker/es/config/es.yml
http.cors.enabled: true
http.cors.allow-origin: "*"
#节点名称
node.name: "node-1"
#节点ip 单机默认回环地址 集群必须绑定真实ip
network.host: 0.0.0.0
#集群名称
cluster.name: es-cluster
#启动运行
docker run -d --name my_es -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms256m -Xmx256m" \
-v /mnt/e/docker/es/config/es.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mnt/e/docker/es/data \
-v /mnt/e/docker/es/data/plugins:/usr/share/elasticsearch/plugins elasticsearch:7.17.3
docker run --name my_oap -d -e TZ=Asia/Shanghai -p 12800:12800 -p 11800:11800 --link my_es -e SW_STORAGE=elasticsearch7 -e SW_STORAGE_ES_CLUSTER_NODES=my_es:9200 apache/skywalking-oap-server:8.5.0-es7
docker run -d --name my_skywalking-ui \
-e TZ=Asia/Shanghai \
-p 8080:8080 \
--link my_oap \
-e SW_OAP_ADDRESS=my_oap:12800 \
apache/skywalking-ui:8.5.0
|
skyworking 的界面 skywalking-ui 访问地址 127.0.0.1:8080
http://127.0.0.1:9200/_cat/indices?v=true&pretty
agent 下载地址
1
2
|
pc wget https://archive.apache.org/dist/skywalking/8.5.0/apache-skywalking-apm-8.5.0.tar.gz
tar -zxvf apache-skywalking-apm-8.5.0.tar.gz
|
要在 log4j 中配置 traceId 的打印位置,通过 postmen 调用几次接口,即可看到 traceId 不一致,方便查看日志。
统一响应格式的封装,通过 ReponseBodyAdvice 来进行统一响应格式的封装,主要是对 beforBodyWrite 方法的改写,转换成对应的前端接口的封装。
其中 SneakyThrows 是不抛出异常的处理。
对比 hello2 和 hello3,两者返回的结果不同,单通过前端返回的结果是一致的,看下图
看看两者之间,格式一样,这是因为通过 aop 的方式,对返回结果都进行了统一处理。
参考文档:
https://juejin.cn/post/7123954724419665950
集成 skyworking
https://juejin.cn/post/7229470524219768893
SneakyThrows(把异常 Throwable 转化为 RuntimeException)
https://www.jianshu.com/p/7d0ed3aef34b
idea 上无法看源码,进行以下操作即可。
1
|
mvn dependency:resolve -Dclassifier=sources
|