美化Spring Boot在datadog上的日志

我们目前现有的SpringBoot项目所有日志都是用logback框架打印,发送到datadog上,目前发现一个问题是默认的logback打印的日志在datadog上非常不美观,类似下面这种

未美化的日志
所有日志都是INFO,没有不同日志等级显示不同颜色的区分。异常栈没有折叠,占用一大片位置,非常难看。而且也没法用datadog的查询attribute功能查traceId。原因是datadog读取日志是按照json格式读取的,而默认的logback输出就是个字符串,于是datadog就直接把整个日志字符串展示出来了。

经过一番搜索,发现有个库叫logstash-logback-encoder,作用就是把logback输出的日志格式化成logstash的格式,再发送给datadog,具体配置如下

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
<configuration>
<property name="LOG_HOME" value="logs"/>
<property name="CONSOLE_LOG_PATTERN" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] [%X{traceId}] %-5level %logger{36} - %msg%n"/>

<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<includeCallerData>true</includeCallerData>
<providers>
<pattern>
<pattern>
{
"timestamp": "%date{\"yyyy-MM-dd HH:mm:ss.SSS\", UTC}",
"level": "%level",
"logger": "%logger",
"className": "%class",
"lineNumber": "%line",
"message": "[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] [%X{traceId}] %-5level %logger{36} - %msg%n",
"traceId": "%mdc{traceId}"
}
</pattern>
</pattern>
<stackTrace>
<throwableConverter class="net.logstash.logback.stacktrace.ShortenedThrowableConverter">
<maxDepthPerThrowable>30</maxDepthPerThrowable>
<maxLength>2048</maxLength>
<shortenedClassNameLength>20</shortenedClassNameLength>
<rootCauseFirst>true</rootCauseFirst>
</throwableConverter>
</stackTrace>
</providers>
</encoder>
</appender>

<root level="INFO">
<appender-ref ref="CONSOLE"/>
</root>
</configuration>

配完后的datadog日志长这样,可以看到有颜色筛选,异常栈都折叠在一个日志里了,看起来清爽多了。

美化后的日志