简介
原文地址:
全网最全的 SpringBoot+Logback 日志配置教程Logback配置文件这么写,TPS提高10倍使用logback输出日志总结Logback基本使用
Logback 是log4j 框架的作者开发的新一代日志框架,它效率更高、能够适应诸多的运行环境,同时天然支持SLF4J Logback的定制性更加灵活,同时也是spring boot的内置日志框架。
- 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
实际开发中我们不需要直接添加该依赖,你会发现spring-boot-starter
其中包含了 spring-boot-starter-logging
,该依赖内容就是 Spring Boot 默认的日志框架 Logback+SLF4J。而 spring-boot-starter-web
包含了spring-boot-starte
,所以我们只需要引入web组件即可:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
- 默认配置
默认情况下Spring Boot将日志输出到控制台,不会写到日志文件。如果要编写除控制台输出之外的日志文件,则需在application.properties
中设置logging.file
或logging.path
属性
ps:二者不能同时使用,如若同时使用,则只有logging.file生效
logging.file=文件名
logging.path=日志文件路径
logging.level.包名=指定包下的日志级别
logging.pattern.console=日志打印规则
logging.file,设置文件,可以是绝对路径,也可以是相对路径。如:logging.file=my.log
logging.path,设置目录,会在该目录下创建spring.log文件,并写入日志内容,如:logging.path=/var/log
ps:二者不能同时使用,如若同时使用,则只有logging.file生效,可以看到这种方式配置简单,但是能实现的功能也非常有限,如果想要更复杂的需求,就需要下面的定制化配置了
- logback-spring.xml详解
Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用
logback-spring.xml
,而不是logback.xml),命名为logback-spring.xml
的日志配置文件,将xml放至src/main/resource
下面。
也可以使用自定义的名称,比如logback-config.xml
,只需要在application.properties
文件中使用logging.config=classpath:logback-config.xml
指定即可。
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<!-- appender是configuration的子节点,是负责写日志的组件。 -->
<!-- ConsoleAppender:把日志输出到控制台 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- 默认情况下,每个日志事件都会立即刷新到基础输出流。 这种默认方法更安全,因为如果应用程序在没有正确关闭appender的情况下退出,则日志事件不会丢失。
但是,为了显着增加日志记录吞吐量,您可能希望将immediateFlush属性设置为false -->
<!--<immediateFlush>true</immediateFlush>-->
<encoder>
<!-- %37():如果字符没有37个字符长度,则左侧用空格补齐 -->
<!-- %-37():如果字符没有37个字符长度,则右侧用空格补齐 -->
<!-- %15.15():如果记录的线程字符长度小于15(第一个)则用空格在左侧补齐,如果字符长度大于15(第二个),则从开头开始截断多余的字符 -->
<!-- %-40.40():如果记录的logger字符长度小于40(第一个)则用空格在右侧补齐,如果字符长度大于40(第二个),则从开头开始截断多余的字符 -->
<!-- %msg:日志打印详情 -->
<!-- %n:换行符 -->
<!-- %highlight():转换说明符以粗体红色显示其级别为ERROR的事件,红色为WARN,BLUE为INFO,以及其他级别的默认颜色。 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) --- [%15.15(%thread)] %cyan(%-40.40(%logger{40})) : %msg%n</pattern>
<!-- 控制台也要使用UTF-8,不要使用GBK,否则会中文乱码 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- info 日志-->
<!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
<!-- 以下的大概意思是:1.先按日期存日志,日期变了,将前一天的日志文件名重命名为XXX%日期%索引,新的日志仍然是project_info.log -->
<!-- 2.如果日期没有发生变化,但是当前日志的文件大小超过10MB时,对当前日志进行分割 重命名-->
<appender name="info_log" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志文件路径和名称-->
<File>logs/project_info.log</File>
<!--是否追加到文件末尾,默认为true-->
<append>true</append>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch><!-- 如果命中ERROR就禁止这条日志 -->
<onMismatch>ACCEPT</onMismatch><!-- 如果没有命中就使用这条规则 -->
</filter>
<!--有两个与RollingFileAppender交互的重要子组件。 第一个RollingFileAppender子组件,即RollingPolicy:负责执行翻转所需的操作。
RollingFileAppender的第二个子组件,即TriggeringPolicy:将确定是否以及何时发生翻转。 因此,RollingPolicy负责什么和TriggeringPolicy负责什么时候.
作为任何用途,RollingFileAppender必须同时设置RollingPolicy和TriggeringPolicy,但是,如果其RollingPolicy也实现了TriggeringPolicy接口,则只需要显式指定前者。-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 日志文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 -->
<!-- 文件名:logs/project_info.2017-12-05.0.log -->
<!-- 注意:SizeAndTimeBasedRollingPolicy中 %i和%d令牌都是强制性的,必须存在,要不会报错 -->
<fileNamePattern>logs/project_info.%d.%i.log</fileNamePattern>
<!-- 每产生一个日志文件,该日志文件的保存期限为30天, ps:maxHistory的单位是根据fileNamePattern中的翻转策略自动推算出来的,例如上面选用了yyyy-MM-dd,则单位为天
如果上面选用了yyyy-MM,则单位为月,另外上面的单位默认为yyyy-MM-dd-->
<maxHistory>30</maxHistory>
<!-- 每个日志文件到10mb的时候开始切分,最多保留30天,但最大到20GB,哪怕没到30天也要删除多余的日志 -->
<totalSizeCap>20GB</totalSizeCap>
<!-- maxFileSize:这是活动文件的大小,默认值是10MB,测试时可改成5KB看效果 -->
<maxFileSize>10MB</maxFileSize>
</rollingPolicy>
<!--编码器-->
<encoder>
<!-- pattern节点,用来设置日志的输入格式 ps:日志文件中没有设置颜色,否则颜色部分会有ESC[0:39em等乱码-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%15.15(%thread)] %-40.40(%logger{40}) : %msg%n</pattern>
<!-- 记录日志的编码:此处设置字符集 - -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- error 日志-->
<!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
<!-- 以下的大概意思是:1.先按日期存日志,日期变了,将前一天的日志文件名重命名为XXX%日期%索引,新的日志仍然是project_error.log -->
<!-- 2.如果日期没有发生变化,但是当前日志的文件大小超过10MB时,对当前日志进行分割 重命名-->
<appender name="error_log" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志文件路径和名称-->
<File>logs/project_error.log</File>
<!--是否追加到文件末尾,默认为true-->
<append>true</append>
<!-- ThresholdFilter过滤低于指定阈值的事件。 对于等于或高于阈值的事件,ThresholdFilter将在调用其decision()方法时响应NEUTRAL。 但是,将拒绝级别低于阈值的事件 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level><!-- 低于ERROR级别的日志(debug,info)将被拒绝,等于或者高于ERROR的级别将相应NEUTRAL -->
</filter>
<!--有两个与RollingFileAppender交互的重要子组件。 第一个RollingFileAppender子组件,即RollingPolicy:负责执行翻转所需的操作。
RollingFileAppender的第二个子组件,即TriggeringPolicy:将确定是否以及何时发生翻转。 因此,RollingPolicy负责什么和TriggeringPolicy负责什么时候.
作为任何用途,RollingFileAppender必须同时设置RollingPolicy和TriggeringPolicy,但是,如果其RollingPolicy也实现了TriggeringPolicy接口,则只需要显式指定前者。-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 -->
<!-- 文件名:logs/project_error.2017-12-05.0.log -->
<!-- 注意:SizeAndTimeBasedRollingPolicy中 %i和%d令牌都是强制性的,必须存在,要不会报错 -->
<fileNamePattern>logs/project_error.%d.%i.log</fileNamePattern>
<!-- 每产生一个日志文件,该日志文件的保存期限为30天, ps:maxHistory的单位是根据fileNamePattern中的翻转策略自动推算出来的,例如上面选用了yyyy-MM-dd,则单位为天
如果上面选用了yyyy-MM,则单位为月,另外上面的单位默认为yyyy-MM-dd-->
<maxHistory>30</maxHistory>
<!-- 每个日志文件到10mb的时候开始切分,最多保留30天,但最大到20GB,哪怕没到30天也要删除多余的日志 -->
<totalSizeCap>20GB</totalSizeCap>
<!-- maxFileSize:这是活动文件的大小,默认值是10MB,测试时可改成5KB看效果 -->
<maxFileSize>10MB</maxFileSize>
</rollingPolicy>
<!--编码器-->
<encoder>
<!-- pattern节点,用来设置日志的输入格式 ps:日志文件中没有设置颜色,否则颜色部分会有ESC[0:39em等乱码-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%15.15(%thread)] %-40.40(%logger{40}) : %msg%n</pattern>
<!-- 记录日志的编码:此处设置字符集 - -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!--给定记录器的每个启用的日志记录请求都将转发到该记录器中的所有appender以及层次结构中较高的appender(不用在意level值)。
换句话说,appender是从记录器层次结构中附加地继承的。
例如,如果将控制台appender添加到根记录器,则所有启用的日志记录请求将至少在控制台上打印。
如果另外将文件追加器添加到记录器(例如L),则对L和L'子项启用的记录请求将打印在文件和控制台上。
通过将记录器的additivity标志设置为false,可以覆盖此默认行为,以便不再添加appender累积-->
<!-- configuration中最多允许一个root,别的logger如果没有设置级别则从父级别root继承 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
<!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 -->
<!-- 级别依次为【从高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE -->
<logger name="com.sailing.springbootmybatis" level="INFO">
<appender-ref ref="info_log" />
<appender-ref ref="error_log" />
</logger>
<!-- 利用logback输入mybatis的sql日志,
注意:如果不加 additivity="false" 则此logger会将输出转发到自身以及祖先的logger中,就会出现日志文件中sql重复打印-->
<logger name="com.sailing.springbootmybatis.mapper" level="DEBUG" additivity="false">
<appender-ref ref="info_log" />
<appender-ref ref="error_log" />
</logger>
<!-- additivity=false代表禁止默认累计的行为,即com.atomikos中的日志只会记录到日志文件中,不会输出层次级别更高的任何appender-->
<logger name="com.atomikos" level="INFO" additivity="false">
<appender-ref ref="info_log" />
<appender-ref ref="error_log" />
</logger>
</configuration>
- 配置logback-spring.xml
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<property resource="logback.properties"/>
<appender name="CONSOLE-LOG" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
</layout>
</appender>
<!--获取比info级别高(包括info级别)但除error级别的日志-->
<appender name="INFO-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder>
<pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>${LOG_INFO_HOME}//%d.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<appender name="ERROR-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>${LOG_ERROR_HOME}//%d.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<root level="info">
<appender-ref ref="CONSOLE-LOG" />
<appender-ref ref="INFO-LOG" />
<appender-ref ref="ERROR-LOG" />
</root>
</configuration>
<?xml version="1.0" encoding="UTF-8" ?>
<!--
configuration是logback的根标签
scan="true" 表示配置文件发生了改变会自动加载
scanPeriod="60 seconds" 检测配置文件修改的时间间隔,默认的单位是毫秒,这里设置的表示每分钟检测
debug="false" debug如果设置为true,表示会打印出来logback自身实时的运行信息,这里就不需要了,因为logback自身运行时非常稳定的,不需要对它做日志
-->
<configuration
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="logback.xsd"
scan="true"
scanPeriod="60 seconds"
debug="false">
<!--默认是从classpath下引用logback.xml,修改名称时需指定-->
<property resource="logback.xml"/>
<!--定义一些参数常量-->
<!--定义日志的输出地址 用于windows电脑日志存放地址路径-->
<property name="log.filepath" value="D:\\logfile\\logfile"/>
<!--定义日志的输出地址 用于linux服务器日志存放地址路径
source="logging.file.path" 指向 yml 或者 properties 配置文件里面的值-->
<springProperty scope="context" name="log.path.linux" source="logging.file.path"/>
<!--
定义日志展示的格式
%d{yyyy-MM-dd HH:mm:ss} 定义一条日志的展示时间
[%thread] 表示执行日志的线程名称
%-5level 空出5个空格,然后显示的日志级别
%logger{100} 显示再哪个类(全限定类名)里面记录的日志,后面的{100}表示这个类名展示的最大长度是100
%msg 表示的日志信息
%n 表示换行
-->
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{100} %msg%n"/>
<!--彩色日志展示的格式-->
<property name="console.log.pattern" value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/>
<!--定义日志输出的媒介-->
<!--定义控制台输出,class指定的具体输出要使动的类-->
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<!--appender其实是负责统一调度日志的输出工作,而具体的日志的格式化工作和输出的工作会交给encoder-->
<encoder>
<!--定义日志输出的格式-->
<pattern>${console.log.pattern}</pattern>
</encoder>
<!--因为consoleAppender只需要记录INFO及其以上级别的日志,对于其他的日志不需要,
所以只需要下面设置即可实现只显示INFO及其以上级别的日志-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<!--
接下来还要定义不同级别的日志输出的媒介
对于日志框架来说,日志是有级别的,logback的日志级别有如下:
trace(追踪) < debug(调试) < info(记录信息) < warn(警告) < error(错误)
再记录日志的时候,一般需要使用到一个Logger类的对象,然后可以调用如下方法:
looger.trace("xxxx"),logger.debug("xxxx"),....等等
如果记录的日志级别是info的话,info是大于trace和debug的,这个时候调用trace和debug发方法记录的日志是无法显示的。而调用warn和error是可以展示的。
一般情况下在开发项目的时候,只需要记录debug,info,error的日志就行了,而这个三个级别的日志需要放在不同的文件中
-->
<!--定义debug级别的日志输出,RollingFileAppender表示滚动日志,可以按天或者按月来生成不同的日志文件-->
<appender name="debugAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--文件路径-->
<file>${log.filepath}/debug.log</file>
<!--定义滚动策略,TimeBasedRollingPolicy是一个基于时间的滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--设置按时间的方式来生成文件,如果文件名是用.gz结尾的,那么logback会自动压
缩日志文件,如果不需要压缩,可以直接把.gz删除就行了
%d{yyyy-MM-dd} 表示按天保存日志
%d{yyyy-MM-dd_HH_mm} 表示按分钟保存日志-->
<fileNamePattern>${log.filepath}/debug-%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<!--设置文件最大保存的历史数据,这里就默认30份就行了,也就是最大保存30个文件-->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!--定义日志格式-->
<encoder>
<!--定义日志输出的格式-->
<pattern>${log.pattern}</pattern>
</encoder>
<!--需要注意 <onMatch>ACCEPT</onMatch> 和 <onMismatch>DENY</onMismatch>
标签只用于日志记录到文件的类型、控制台输出不能使用
因为debugAppender只需要记录debug级别的日志,对于其他的日志不需要,
所以要加一个过滤器
<onMatch>ACCEPT</onMatch> 和 <onMismatch>DENY</onMismatch> 两个标签
可以实现只显示某一级别的日志,使用这两个标签后,会把非匹配级别的日志直接过滤掉,
如果只是用了 <level>DEBUG</level> 标签,那么设置级别(包括设置的级别)以上
的级别都会被记录下来-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<!--如果是DEBUG日志,同意被记录到文件-->
<onMatch>ACCEPT</onMatch>
<!--如果不是DEBUG日志,直接忽略-->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--定义info级别的日志的appender-->
<appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--文件路径-->
<file>${log.filepath}/info.log</file>
<!--定义滚动策略,TimeBasedRollingPolicy是一个基于时间的滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--设置按时间的方式来生成文件,如果文件名是用.gz结尾的,那么logback会自动压
缩日志文件,如果不需要压缩,可以直接把.gz删除就行了
%d{yyyy-MM-dd} 表示按天保存日志
%d{yyyy-MM-dd_HH_mm} 表示按分钟保存日志-->
<fileNamePattern>${log.filepath}/info-%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<!--设置文件最大保存的历史数据,这里就默认30份就行了,也就是最大保存30个文件-->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!--定义日志格式-->
<encoder>
<!--定义日志输出的格式-->
<pattern>${log.pattern}</pattern>
</encoder>
<!--需要注意 <onMatch>ACCEPT</onMatch> 和 <onMismatch>DENY</onMismatch>
标签只用于日志记录到文件的类型、控制台输出不能使用
因为infoAppender只需要记录debug级别的日志,对于其他的日志不需要,
所以要加一个过滤器
<onMatch>ACCEPT</onMatch> 和 <onMismatch>DENY</onMismatch> 两个标签
可以实现只显示某一级别的日志,使用这两个标签后,会把非匹配级别的日志直接过滤掉,
如果只是用了 <level>DEBUG</level> 标签,那么设置级别(包括设置的级别)以上
的级别都会被记录下来-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<!--如果是INFO日志,同意被记录到文件-->
<onMatch>ACCEPT</onMatch>
<!--如果不是INFO日志,直接忽略-->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--定义error级别的日志的appender-->
<appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--文件路径-->
<file>${log.filepath}/error.log</file>
<!--定义滚动策略,TimeBasedRollingPolicy是一个基于时间的滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--设置按时间的方式来生成文件,如果文件名是用.gz结尾的,那么logback会自动压
缩日志文件,如果不需要压缩,可以直接把.gz删除就行了
%d{yyyy-MM-dd} 表示按天保存日志
%d{yyyy-MM-dd_HH_mm} 表示按分钟保存日志-->
<fileNamePattern>${log.filepath}/error-%d{yyyy-MM-dd_HH_mm}.log.gz</fileNamePattern>
<!--设置文件最大保存的历史数据,这里就默认2份就行了,也就是最大保存2个文件-->
<maxHistory>2</maxHistory>
</rollingPolicy>
<!--定义日志格式-->
<encoder>
<!--定义日志输出的格式-->
<pattern>${log.pattern}</pattern>
</encoder>
<!--需要注意 <onMatch>ACCEPT</onMatch> 和 <onMismatch>DENY</onMismatch>
标签只用于日志记录到文件的类型、控制台输出不能使用
因为errorAppender只需要记录debug级别的日志,对于其他的日志不需要,
所以要加一个过滤器
<onMatch>ACCEPT</onMatch> 和 <onMismatch>DENY</onMismatch> 两个标签
可以实现只显示某一级别的日志,使用这两个标签后,会把非匹配级别的日志直接过滤掉,
如果只是用了 <level>DEBUG</level> 标签,那么设置级别(包括设置的级别)以上
的级别都会被记录下来-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<!--如果是ERROR日志,同意被记录到文件-->
<onMatch>ACCEPT</onMatch>
<!--如果不是ERROR日志,直接忽略-->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--根日志记录器,所有包下面的日志都会被记录-->
<root level="DEBUG">
<appender-ref ref="debugAppender"/>
<appender-ref ref="infoAppender"/>
<appender-ref ref="errorAppender"/>
</root>
<!--根日志记录器,所有包下面的日志都会被记录-->
<root level="DEBUG">
<appender-ref ref="consoleAppender"/>
</root>
<!--自定义记录器
配置自己写的代码的日志记录器
name="com.dkk" 表示对应包(包含子包)里面的代码产生的日志,会被下面的日志记录器记录,否则不会被记录
level="DEBUG" 表示日志记录的级别是DEBUG,如果不指定level的时候,这个日志记录器对应的级别自动继承根记录器
additivity="true" 表示自定义的记录器日志输出-->
<logger name="com.dkk" level="DEBUG" additivity="true">
</logger>
</configuration>
- logback 高级特性异步输出日志
<!-- 异步输出 -->
<appender name="ASYNC-INFO" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>256</queueSize>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="INFO-LOG"/>
</appender>
<appender name="ASYNC-ERROR" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>256</queueSize>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="ERROR-LOG"/>
</appender>