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 来配置,并将日志输出到 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 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");