依赖引入
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.7</version>
</dependency>
使用logback日志框架只需要引入以上即可,(我们平时使用较多的@Slf4j注解是另外的机制触发)后续会谈到
查看以上的maven依赖项引入如下:
该依赖项引入了:
slf4j-api
logback-core
logback-classic
配置项样列
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<property name="LOG_HOME" value="./logs"/>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder
class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{5}: - %m%n</pattern>
<!-- <pattern>${COLOR_PATTERN}</pattern>-->
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="LOGFILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名 -->
<FileNamePattern>${LOG_HOME}/performance-batch.%d{yyyy-MM-dd}.log
</FileNamePattern>
<!--日志文件保留天数 -->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}: - %msg%n</pattern>
</encoder>
</appender>
<!--此日志文件只包含错误日志-->
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/performance-batch-error.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<!-- 追加方式记录日志 -->
<append>true</append>
<!-- 日志文件的格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{3}: - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 此日志文件只记录error级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="LOGFILE_ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="LOGFILE"/>
</appender>
<appender name="LOG_ERROR_FILE_ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="ERROR"/>
</appender>
<logger name="HuaweiCloud-SDK-Access" level="OFF"/>
<!-- 日志输出级别 -->
<root level="info">
<appender-ref ref="STDOUT"/>
<appender-ref ref="LOGFILE_ASYNC"/>
<appender-ref ref="LOG_ERROR_FILE_ASYNC"/>
</root>
</configuration>
常用占位符含义
%C = %class【等价】打印全类名 ---不推荐,耗性能
%d = %date【等价】 日期格式可以在后面用{}表示
%F = %file 【等价】 发出日志请求的java源文件名字 ---不推荐,耗性能
%L = %line 【等价】 java文件中请求的行号 ---不推荐,耗性能
%m = %msg = %message 日志正文信息
%M = %method 日志请求发出的方法的方法名----不推荐,耗性能
%n 换行符
%p = %le = %level【等价】 日志级别 %-5p 表示打印日志级别,且左对齐5个字符的距离
%t = %thread 线程名称
%i 文件序号,在单条日志中不支持,在文件名称处支持
源码浅析
从结构上看,logback的配置解析是从<configuration debug="false">标签开始的,从代码上看入口是:
org.slf4j.impl.StaticLoggerBinder的静态代码块开始的。
从代码上看logback配置文件的优先级如下:
最终会把xml配置内容解析成一个LoggerContext对象,其中的结构关系如下:
每个Logger包含的元素有:名称、日志级别、生效的日志级别、父Logger、子logger列表、一组Appender列表...
未在xml中明确定义的logger的日志输出相关的所有限制继承父类,所有logger的父类是Root