logback配置

logback配置文件加载顺序

  1. 在 classpath 中寻找 logback-test.xml文件
  2. 如果找不到 logback-test.xml,则在 classpath 中寻找 logback.groovy 文件
  3. 如果找不到 logback.groovy,则在 classpath 中寻找 logback.xml文件
  4. 如果上述的文件都找不到,则 logback 会使用 JDK 的 SPI 机制查找 META-INF/services/ch.qos.logback.classic.spi.Configurator 中的 logback 配置实现类,这个实现类必须实现 Configuration 接口,使用它的实现来进行配置
  5. 如果上述操作都不成功,logback 就会使用它自带的 BasicConfigurator 来配置,并将日志输出到 console

    logback配置结构

    configuration
     - appender
     - logger
     - root 
    

下面详细说明各个标签的详细配置

configuration

<configuration scan="true" scanPeriod="60 seconds" debug="false">  
    <property name="glmapper-name" value="glmapper-demo" /> 
    <contextName>${glmapper-name}</contextName> 

    <appender>
        //xxxx
    </appender>   

    <logger>
        //xxxx
    </logger>

    <root>             
       //xxxx
    </root>  
</configuration>   
属性名称 属性说明
scan 为true时,配置文件变化后会自动重新加载,默认设置为true
scanPeriod 扫描配置文件的时间间隔,如果没有给出时间单位,默认为ms。当scan为true,此属性生效,默认值为1m
debug 为true时,打印logback内部的日志,默认为false

contextName

<contextName>${glmapper-name}</contextName> 

默认的contextName为default,可以通过设置contextName来区分不同应用程序的日志

property

<property name="glmapper-name" value="glmapper-demo" />

property标签用来定义变量,具有如下两个属性

属性名称 属性说明
name 变量名称
value 变量值

定义变量之后,可以通过表示式来使用变量

${name}

logger

用来设置某一个包或者具体的某一个类的日志打印级别以及指定appender。

<logger name="com.meitu.alarm" level="debug" additivity="false">
属性名称 属性说明
name logger名称,必填,与LoggerFactory.getLogger(“name”)中的name对应
level level的取值可以为TRACE, DEBUG, INFO, WARN, ERROR, ALL, OFF
additivity 是否向父类继续上报日志,如果设置为true,则日志会向上传递,父类也会打印该日志

标签只有一个子标签,用来绑定对应的appender

appender

appender用来标识日志输出的格式以及日志输出地点,可以是控制台,文件

<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
</appender>
属性名称 属性说明
name appender的名称
class appender的实现类名称
标签下可以包含至多一个 ,0个或多个 ,0个或多个

以下是几种常见的appender
### Console
将日志输出到控制台中



%d{YY-MM-dd HH:mm:ss.SSS} %-5level %logger{36} - %msg%n

RollingFileAppender(by time)

将日志输出到文件中,并根据time分割日志

<appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/debug.log</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss} %logger %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/debug.%d{yyyyMMdd-HH}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

JSON Appender

按照JSON格式输出日志

<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
        <providers>
            <pattern>
                <pattern>
                    {
                    "timestamp": "%date{\"yyyy-MM-dd HH:mm:ss\"}",
                    "log_level": "%level",
                    "class_name": "%class",
                    "message": "%message",
                    "stack_trace": "%exception{5}"
                    }
                </pattern>
            </pattern>
        </providers>
        <!--<charset>UTF-8</charset>-->
    </encoder>
</appender>

多环境日志输出

根据不同的环境(test,dev,pre,release)来定义输出日志

<springProfile name="test,dev"> //多个环境用逗号分隔
    <logger name="com.meitu.alarm" level="debug" additivity="false">
        <appender-ref ref="debug"/>
        <appender-ref ref="info"/>
        <appender-ref ref="warn"/>
        <appender-ref ref="error"/>
    </logger>
</springProfile>

<springProfile name="release">
    <logger name="com.meitu.alarm" level="info" additivity="false">
        <appender-ref ref="console"/>
    </logger>
</springProfile>

关闭某个包或者某个类的日志

<logger name="packageName" level="OFF" />

自定义字段

若日志最终存储到ES中,可以在JSON中添加自定义的字段,方便问题的排查

StructuredArguments提供的结构化字段

import static net.logstash.logback.argument.StructuredArguments.*
//output: log message value
logger.info("log message {}", value("name", "value"));

//output: log message name=value
logger.info("log message {}", keyValue("name", "value"));

//json output: {"message":"log message","name":"value"}
logger.info("log message", keyValue("name", "value"));

如果想在输出的JSON中,加上自定义字段,需要配置arguments参数

<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
        <providers>
            <pattern>
                <pattern>
                    {
                    "timestamp": "%date{\"yyyy-MM-dd HH:mm:ss\"}",
                    "log_level": "%level",
                    "class_name": "%class",
                    "thread": "%thread",
                    "message": "%message",
                    "stack_trace": "%exception{5}"
                    }
                </pattern>
            </pattern>
            <arguments/>
        </providers>
    </encoder>

Markers提供的标记

import static net.logstash.logback.marker.Markers.*

 /*
 * Add "name":"value" to the JSON output.
 */
logger.info(append("name", "value"), "log message");

/*
 * Add "name1":"value1","name2":"value2" to the JSON output by using multiple markers.
 */
logger.info(append("name1", "value1").and(append("name2", "value2")), "log message");

参考文献


Reprint please specify: wbl logback配置

Previous
InfluxDB简介 InfluxDB简介
InfluxDB简介InfluxDB是一个时序型数据库,用于高性能的查询与存储时序型数据。目前,InfluxDB被广泛的用于监控系统中。InfluxDB与Grafana结合,可以为用户带来清晰明了的监控面板。 InfluxDB安装macOS
2019-02-16
Next
Prometheus2.0实战 Prometheus2.0实战
Prometheus 1.x VS Prometheus 2.x1.0版本与2.0版本最大的改变之一就是存储引擎,1.x版本使用的是LevelDB,2.x使用的是TSDB,性能上有较大的提升,以下是官方对比数据 与 Prometheus
2019-01-26