1、logback 简介
在springboot 中,任何一个 spring-boot-starter-* 都会默认导入一个 spring-boot-starter-logging 启动器依赖,默认集成的是 logback 日志,可以在项目的 application.yml 中添加日志相关配置,也可以直接指定日志配置文件进行配置。
2、集成 logback 的方式
2.1、springboot 方式
任何一个 spring-boot-starter-* 都会默认导入一个 spring-boot-starter-logging 启动器依赖,因此只要当前项目的依赖中有starter,无需显式引入。
2.2、非 springboot 项目
需要在当前项目中的 pom 文件中引入以下依赖:
<!-- slf4j日志门面的一个具体实现 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
3、日志配置文件的命名规范
springboot 框架默认加载 logback 的日志配置文件是 logback-spring.xml,如果需要自定义配置文件名,需要在当前项目中指定日志配置文件。配置文件引入配置如下:
logging.location=classpath:mylogback.xml # 在 resources 目录下定义
4、logback 配置文件详解
4.1、logback 配置文件使用的标准
一般 logback-spring.xml 文件中没有这些信息,添加之后可以在写配置文件的时候有提示。
<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns="http://ch.qos.logback/xml/ns/logback"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ch.qos.logback/xml/ns/logback
https://raw.githubusercontent.com/enricopulatzo/logback-XSD/master/src/xsd/logback.xsd" debug="true">
4.2、动态加载配置文件
<!-- 在 configuration 标签中添加 scan 标签-->
<configuration scan="true" scanPeriod="10 seconds" debug="false">
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true;
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟;
debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
4.3、引用/自定义属性值
<!-- 用来加载logback的配置属性 -->
<!-- 使用classpath的方式引入文件,只需写明文件名即可-->
<property resource="logback.properties"/>
<contextName>logback</contextName> <!-- 属性文件中定义的属性前缀 -->
<!-- 自定义属性值:
name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。
定义变量后,可以使“${}”来使用变量。 -->
<property name="log.path" value="D:/mylog" />
4.4、appender 标签
appender 标签是 configuration 的子节点,是负责写日志的组件;其有两个必要的属性: name 和 class。
name 表示 appender 的名称,class 表示使用 appender 类型的全限定类名。
主要有以下几种 appender:
<!-- 1、控制台输出的appender -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
</appender>
<!-- 2、文件输出的appender -->
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
</appender>
<!-- 3、滚动记录文件输出的appender -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
</appender>
<!-- 4、异步输出的appender -->
<appender name="ASYNC-INFO" class="ch.qos.logback.classic.AsyncAppender">
</appender>
4.4.1、控制台输出的 ConsoleAppender
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 日志输出的格式 -->
<!-- 按照顺序分别是:时间、日志级别、线程名称、打印日志的类、日志主体内容、换行 -->
<pattern>[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n</pattern>
</encoder>
</appender>
4.4.2、输出到文件的 FileAppender
<!--写入文件的appender-->
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>testFile.log</file> <!--定义日志文件名-->
<append>true</append> <!--是否追加-->
<encoder>
<pattern>[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n</pattern>
</encoder>
</appender>
4.4.3、滚动输出到文件
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>test.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>tests.%i.log.zip</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>5MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
4.4.3.1、滚动策略(RollingPolicy):
1、TimeBasedRollingPolicy:最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。
有以下几个标签:
1)、fileNamePattern:必要节点,包含文件名及“%d”转换符, 如:%d{yyyy-MM}。如果直接使用 %d,默认格式是 yyyy-MM-dd。
2)、maxHistory:可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每个月滚动,且值是6
,则只保存最近6
个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除。
3)、file:RollingFileAppender 的file子节点可有可无,通过设置file,可以为活动文件和归档文件指定不同位置,当前日志总是记录到file指定的文件(活动文件),活动文件的名字不会改变;如果没设置file,活动文件的名字会根据fileNamePattern 的值,每隔一段时间改变一次。
4)、totalSizeCap:日志最大保存的大小。当超过该值,会自动删除老的日志文件。必须和maxHistory一起使用,而且maxHistory先生效,其次是判断是否达到totalSizeCap。
5)、cleanHistoryOnStart:默认false。如果设置为true,再项目启动的时候会自动删除老的日志文件。
2、FixedWindowRollingPolicy: 根据固定窗口算法重命名文件的滚动策略。
有以下几个标签:
1)、minIndex:窗口索引最小值。
2)、maxIndex:窗口索引最大值。
3)、fileNamePattern : 必须包含 %i,例如,假设最小值和最大值分别为1和2,命名模式为 mylog%i.log,会产生归档文件 mylog1.log 和 mylog2.log。还可以指定文件压缩选项,例如,mylog1.log.gz 或者 mylog1.log.zip。
4.4.3.2、触发策略(TriggeringPolicy) :
1、SizeBasedTriggeringPolicy:查看当前活动文件的大小,如果超过指定大小会告知RollingFileAppender 触发当前活动文件滚动。
有以下子标签:
maxFileSize:这是活动文件的大小,默认值是 10MB;
4.4.3.3、过滤器 (Filter)
1、LevelFilter :级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据 onMath 和 onMismatch 接收或拒绝日志;
有以下子节点 :
level: 设置过滤级别;
onMatch: 用于配置符合过滤条件的操作,DENY,NEUTRAL,ACCEPT;
onMismatch: 用于配置不符合过滤条件的操作,DENY,NEUTRAL,ACCEPT。
2、ThresholdFilter:临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝,只有一个 level 子节点。
4.5、logger 标签
用来设置某一个包或者具体的某一个类的日志打印级别、以及指定 appender;仅有一个 name 属性,一个可选的 level 和一个可选的 addtivity 属性。
name:用来指定受此 logger 约束的某一个包或者具体的某一个类;
level:用来设置打印级别,大小写无关,还有一个特定值 INHERITED 或者同义词 NULL,代表强制执行上级的级别。 如果未设置此属性,那么当前logger将会继承上级的级别。
additivity:是否向上级 logger 传递打印信息,默认是 true。
<Logger name="org.springframework" level="info" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
4.6、root 标签
root 标签是必选节点,用来指定最基础的日志输出级别,只有一个 level 属性,默认是 debug,可以包含零个或多个元素。标识这些 appender 将会添加到这个 logger。
root 表示当前项目中根节点的日志,如果一个项目名称为 com.test.demo,有几个 logger 记录器:root -> com -> com.test -> com.test.demo。
<root level="info">
<appender-ref ref="CONSOLE" />
<appender-ref ref="DEBUG_FILE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
5、完整的 logback-spring.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns="http://ch.qos.logback/xml/ns/logback"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ch.qos.logback/xml/ns/logback
https://raw.githubusercontent.com/enricopulatzo/logback-XSD/master/src/xsd/logback.xsd" debug="true"
scan="true" scanPeriod="10 seconds">
<!--scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的 时间间隔为1分钟。-->
<!-- 用来加载logback的配置属性 -->
<!-- 使用classpath的方式引入文件,只需写明文件名即可-->
<property resource="logback.properties"/>
<contextName>logback</contextName>
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
<property name="log.path" value="D:/mylog" />
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- 指定日志输出的位置 -->
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<!--<encoder>:对日志进行格式化:一是把日志信息转换成字节数组,二是把字节数组写入到输出流。-->
<encoder>
<!-- 日志输出的格式 -->
<!-- 按照顺序分别是:时间、日志级别、线程名称、打印日志的类、日志主体内容、换行 -->
<pattern>[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n</pattern>
</encoder>
<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>info</level>
</filter>
<!-- 此日志文件只记录debug级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>debug</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--写入文件的appender-->
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>testFile.log</file>
<append>true</append> <!--是否追加-->
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>test.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>tests.%i.log.zip</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>5MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<!-- 设置全局日志级别。日志级别按顺序分别是:DEBUG、INFO、WARN、ERROR -->
<!-- 指定任何一个日志级别都只打印当前级别和后面级别的日志。 -->
<root level="DEBUG">
<!-- 指定打印日志的appender,这里通过“STDOUT”引用了前面配置的appender -->
<appender-ref ref="STDOUT" />
</root>
<!-- 根据特殊需求指定局部日志级别 -->
<logger name="com.test.mapper" level="DEBUG"/>
</configuration>
总结:springboot 默认集成的是 logback 日志框架,使用的是 sl4j 日志门面。以上关于 logback 的使用和配置足以满足项目的使用。
本人是一个从小白自学计算机技术,对运维、后端、各种中间件技术、大数据等有一定的学习心得,想获取自学总结资料(pdf版本)或者希望共同学习,关注微信公众号:it自学社团。后台回复相应技术名称/技术点即可获得。(本人学习宗旨:学会了就要免费分享)