Logback日志格式配置相关记录

参考链接,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>
posted @ 2021-10-26 23:41  zeng1994  阅读(1056)  评论(0编辑  收藏  举报