参考链接,http://www.logback.cn/
一、logback打印json格式到文件注意事项
1.用springboot默认的encoder
一定要对日志内容中的双引号进行转义,不然会破坏json的结构。转义方法 采用 %replace对双引号进行转义,参考下面的案例
{"systemName":"%property{systemName}" , "level": "%level", "time":"%d", "traceId": "%X{traceId}", "spanId": "%X{spanId}",
"context": "%replace(%t [%c] - %m){'"','\"'}" }%n
这里context里面的值进行了替换,把双引号进行了转义
缺点:打印异常信息不方便,出现异常栈没打印的情况
2. 用LoggingEventCompositeJsonEncoder
这个是比较好的方案,这个encoder是logstash实现的,可以用来输出json
参考下面配置
<encoder
class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<!--<timestamp>-->
<!--<timeZone>UTC</timeZone>-->
<!--</timestamp>-->
<pattern>
<!--可以直接从apollo中取值-->
<pattern>
{"time":"%d{yyyy-MM-dd'T'HH:mm:ss.SSS+08:00}",
"systemName":"%property{systemName}" ,
"level": "%level",
"traceId": "%X{traceId}",
"spanId": "%X{spanId}",
"context": "%t [%c] - %m ",
"exceptionTrace":"%exception{50}"
}%n --这个换行符,建议在输出到文件时使用,如果直接输出到logstash则不需要
</pattern>
</pattern>
</providers>
</encoder>
二、logback从apollo中取值时注意事项
前提:springboot项目中
(1) apollo配置中开启eagerLoad
用properties参考下面配置:
用yml参考下面配置(注意这里eagerLoad必须这样子写):
(2)logback配置文件建议用logback-spring.xml
(3)需要使用的方式从apollo中取值时,采用springProperty的方式,参考下面配置
<springProperty scope="context" name="JUUL_MAX_FILE_SIZE" source="JUUL_MAX_FILE_SIZE" defaultValue="1GB"/>
三、elk相关
1.如果只是简单配置,那么直接用LogstashEncoder即可
<!--输出到logstash的appender-->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!--可以访问的logstash日志收集端口-->
<destination>${logstashDestination:-192.168.200.50:5000}</destination>
<keepAliveDuration>5 minutes</keepAliveDuration>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
<customFields>{"idx_pre": "${idx_pre}"}</customFields>
<timeZone>UTC</timeZone>
</encoder>
</appender>
2.如果想玩点花的,那么用LoggingEventCompositeJsonEncoder
<appender name="LOGSTASH_THIRD_ACCESS" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>${logstashDestination:-192.168.200.50:5000}</destination>
<keepAliveDuration>5 minutes</keepAliveDuration>
<!--输出定制化格式的json时,用 LoggingEventCompositeJsonEncoder-->
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers >
<pattern>
<pattern>
{
"idx_pre": "elk-original-third-access",
"json": "#asJson{%message}" -- 这个asJson比较骚,可以把对应的字符串作为json对象取出来,这样es可以对json里面的字段索引了
}
</pattern>
</pattern>
</providers>
</encoder>
</appender>