參考鏈接,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>
