logback配置文件加载顺序
- 在 classpath 中寻找 logback-test.xml文件
- 如果找不到 logback-test.xml,则在 classpath 中寻找 logback.groovy 文件
- 如果找不到 logback.groovy,则在 classpath 中寻找 logback.xml文件
- 如果上述的文件都找不到,则 logback 会使用 JDK 的 SPI 机制查找 META-INF/services/ch.qos.logback.classic.spi.Configurator 中的 logback 配置实现类,这个实现类必须实现 Configuration 接口,使用它的实现来进行配置
- 如果上述操作都不成功,logback 就会使用它自带的 BasicConfigurator 来配置,并将日志输出到 consolelogback配置结构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 name="console" class="ch.qos.logback.core.ConsoleAppender">
</appender>
| 属性名称 | 属性说明 | 
|---|---|
| name | appender的名称 | 
| class | appender的实现类名称 | 
以下是几种常见的appender
### Console
将日志输出到控制台中
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");
 
                     
                     
                        
                        