springboot3+skyworking+log4j2

前置条件:

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,可以自定义展示的颜色如下图所示

image-20230506134512756

集成 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

image-20230506135321345

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

image-20230506135526353

要在 log4j 中配置 traceId 的打印位置,通过 postmen 调用几次接口,即可看到 traceId 不一致,方便查看日志。

统一响应格式的封装,通过 ReponseBodyAdvice 来进行统一响应格式的封装,主要是对 beforBodyWrite 方法的改写,转换成对应的前端接口的封装。

image-20230506135919484

其中 SneakyThrows 是不抛出异常的处理。

image-20230506140158501

对比 hello2 和 hello3,两者返回的结果不同,单通过前端返回的结果是一致的,看下图

image-20230506140255301

image-20230506140310417

看看两者之间,格式一样,这是因为通过 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
Licensed under CC BY-NC-SA 4.0
最后更新于 Jan 06, 2025 05:52 UTC
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
Caret Up