Springboot 日志框架
1、概述
项目中日志系统是必不可少的的。 目前比较流行的日志框架有log4j
、logback
等 。可能大家还不知道,这两个框架的作者是同一个人,Logback
旨在作为流行的log4j
项目的后续版本,从而恢复log4j
离开的位置。另外 slf4j(Simple Logging Facade for Java)
则是一个日志门面框架,提供了日志系统中常用的接口,logback
和log4j
则对slf4j
进行了实现。
2、为什么使用logback
- Logback 是
log4j
框架的作者开发的新一代日志框架,它效率更高、能够适应诸多的运行环境,同时天然支持SLF4J
Logback
的定制性更加灵活,同时也是spring boot
的内置日志框架
3、默认配置
默认情况下Spring Boot
将日志输出到控制台,不会写到日志文件。如果要编写除控制台输出之外的日志文件,则需在application.yaml
中设置logging.file
或logging.path
属性
logging: file: path: 日志文件路径 name: 文件名 level: debug pattern: console: 日志打印规则
4、logback-spring.xml详解
Spring Boot
官方推荐优先使用带有-spring
的文件名作为你的日志配置(如使用logback-spring.xml
,而不是logback.xml
),命名为logback-spring.xml
的日志配置文件,将xml放至 src/main/resource
下面。
在讲解 logback-spring.xml
之前我们先来了解三个单词:Logger
, Appenders
和Layouts
(记录器、附加器、布局):Logback
基于三个主要类:Logger
,Appender
和Layout
。 这三种类型的组件协同工作,使开发人员能够根据消息类型和级别记录消息,并在运行时控制这些消息的格式以及报告的位置。首先给出一个基本的xml配置如下:
<configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default --> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <logger name="chapters.configuration" level="INFO"/> <!-- Strictly speaking, the level attribute is not necessary since --> <!-- the level of the root level is set to DEBUG by default. --> <root level="DEBUG"> <appender-ref ref="STDOUT" /> </root> </configuration>
5、详细示例:
<?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>
copy一下 原文地址:https://www.cnblogs.com/alanlin/p/16202266.html