前言
本文详细介绍了日志管理工具logback的使用方法。logback是一种日志管理工具,可以实现配置日志的储存路径、日志格式、将日志分类存储至指定文件、设置日志文件大小和存储期限(超过则删除老旧日志),按期或按照指定大小将日志分割并转存到指定目录、指定某目录或类的日志级别等功能。
详细配置文件代码见 http://t.csdn.cn/pmIRm
一、 logback配置文件概述
Spring Boot默认是使用Logback的,并且提供了自动配置。
1.1 配置文件名称
默认加载名为:logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy的配置文件
1.2 配置文件加载顺序
Spring的加载顺序:logback.xml > application.properties > logback-spring.xml
注意:日志系统是在Spring上下文之前创建的,因此不能使用@PropertySource配置,建议使用 logback-spring.xml。
1.3 结构
logback需配置configuration属性,格式如下:
<configuration scan="true" scanPeriod="60 seconds" debug="false">
</configuration>
configuration属性内可配置变量并为变量赋值;
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 定义 -->
<variable name="USER_HOME" value="/home/sebastien" />
<property name="USER_HOME1" value="/home/sebastien" />
<!-- 引用外部配置 -->
<variable file="src/main/java/chapters/configuration/variables1.properties" />
<variable resource="resource1.properties" />
</configuration>
configuration属性内可配置三类节点:appender、logger、root,格式如下
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<variable name="USER_HOME" value="/home/sebastien" />
<property name="USER_HOME1" value="/home/sebastien" />
<!-- 引用外部配置 -->
<variable file="src/main/java/chapters/configuration/variables1.properties" />
<variable resource="resource1.properties" />
<!-- 控制台输出 -->
<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{15}:%line] - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<logger name="com.z7.springcloud.service" ></logger>
<!-- 日志输出级别 -->
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
二、configuration属性配置
2.1 使用示例
<configuration scan="true" scanPeriod="60 seconds" debug="false" packagingData="false">
</configuration>
2.2 参数说明
2.3 解析
scan源码:ch.qos.logback.classic.joran.action.ConfigurationAction
package ch.qos.logback.classic.joran.action;
// ..............
public class ConfigurationAction extends Action {
static final String INTERNAL_DEBUG_ATTR = "debug";
static final String PACKAGING_DATA_ATTR = "packagingData";
static final String SCAN_ATTR = "scan";
static final String SCAN_PERIOD_ATTR = "scanPeriod";
// ....scan....
void processScanAttrib(InterpretationContext ic, Attributes attributes) {
String scanAttrib = ic.subst(attributes.getValue(SCAN_ATTR));
//
if (!OptionHelper.isEmpty(scanAttrib) && !"false".equalsIgnoreCase(scanAttrib)) {
ScheduledExecutorService scheduledExecutorService = context.getScheduledExecutorService();
URL mainURL = ConfigurationWatchListUtil.getMainWatchURL(context);
if (mainURL == null) {
addWarn("Due to missing top level configuration file, reconfiguration on change (configuration file scanning) cannot be done.");
return;
}
ReconfigureOnChangeTask rocTask = new ReconfigureOnChangeTask();
rocTask.setContext(context);
context.putObject(CoreConstants.RECONFIGURE_ON_CHANGE_TASK, rocTask);
String scanPeriodAttrib = ic.subst(attributes.getValue(SCAN_PERIOD_ATTR));
Duration duration = getDuration(scanAttrib, scanPeriodAttrib);
if (duration == null) {
return;
}
addInfo("Will scan for changes in [" + mainURL + "] ");
// Given that included files are encountered at a later phase, the complete list of files
// to scan can only be determined when the configuration is loaded in full.
// However, scan can be active if mainURL is set. Otherwise, when changes are detected
// the top level config file cannot be accessed.
addInfo("Setting ReconfigureOnChangeTask scanning period to " + duration);
ScheduledFuture<?> scheduledFuture = scheduledExecutorService.scheduleAtFixedRate(rocTask, duration.getMilliseconds(), duration.getMilliseconds(),
TimeUnit.MILLISECONDS);
context.addScheduledFuture(scheduledFuture);
}
}
// ........
}
三、<appender>标签详解
3.1 定义
1、Appender是Logback中执行将日志事件输出的组件。
2、必须在< root >或者< logger >中通过< appender-ref >引用相应的< appender >才生效。< logger >、< root >会将相关的日志事件委托给< appender >执行日志的输出(控制台或者文件)
3.2 Appender类图说明
Appender的类图如下:(此图摘自Logback官网)
通过上述类图可以看出:
1、Appender中包含Filter;
2、Appender中包含Encoder;
3、Appender分为ConsoleAppender(控制台)、FileAppender(日志文件)两种。
3.3 Appender概述
1、Appender包含两个属性name、class;
2、Appender按类型分为 ConsoleAppender(控制台输出日志)、FileAppender(日志文件)。
class包括:ch.qos.logback.core.ConsoleAppender(控制台日志)、ch.qos.logback.core.rolling.FileAppender、ch.qos.logback.core.rolling.RollingFileAppender
使用示例:
<!--
springProperty: 读取spring环境ConfigurableEnvironment配置,即application.yml或者application.peroperties中的配置
-->
<springProperty name="CONSOLE_LOG_PATTERN" source="logging.pattern.console"
defaultValue="%clr(%d{HH:mm:ss.SSS}){faint} %clr(%5p) %clr(---){faint} %clr([%25.25t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n"/>
<!-- 控制台日志 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
</appender>
<!-- 日志文件 -->
<appender name="FILE_ALL" class="ch.qos.logback.core.rolling.FileAppender">
</appender>
<!-- 滚动日志文件-->
<appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
</appender>
3.4 ConsoleAppender使用
控制台输出,底层通过System.out 来实现的
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
3.5 FileAppender使用
顾名思义,就是将日志事件追加到指定日志文件中
3.5.1 FileAppender使用
ch.qos.logback.core.FileAppender并不常用,一般都是使用ch.qos.logback.core.rolling.RollingFileAppender(支持分片和自动删除)
属性配置如下
3.5.2 RollingFileAppender使用
继承自FileAppender,支持日志分片和历史日志的自动删除,其属性如下
RollingFileAppender执行流程如下:
1、日志始终往file配置的日志文件中追加写入,如file不存在则自动创建,如 /temp/test.log
2、按rollingPolicy配置的策略,当满足策略时,自动将file重命名为rollingPolicy中指定的归档日志文件名,生成历史归档日志,如 /temp/test.2023-04-12.log,并对归档日志进行压缩 和 过期日志删除。
3、循环 1-2
3.5.2.1 RollingPolicy
1、TimeBasedRollingPolicy
日志文件按fileNamePattern指定的日志文件名和%d指定的日期进行归档,文件名即为fileNamePattern指定文件
若日志为超出maxHistory指定时间范围外的,则异步删除归档日志
若在maxHistory指定时间范围内,则判断总的日志大小是否超过totalSizeCap,超过则异步删除最老日志文件
2、SizeAndTimeBasedRollingPolicy
TimeBasedRollingPolicy的子类,扩展点如下:
1、区别仅仅是多一个参数maxFileSize配置指明单个日志文件最大值
2、fileNamePattern中支持语法%i配置分片规则,从0开始自增
3、跨天的先 按天分片,同一天内file容量超过maxFileSize ,再按maxFileSize容量分片
==> 如: /log/myapplication.%d{yyyy-MM-dd}.%i.log => /log/myapplication.2022-04-01.0.log
cleanHistoryOnStart默认值为false。
3.5.2.2 TriggeringPolicy
不需要额外配置。
控制发生滚动(分片)的条件。这些条件包括一天中的时间、文件大小、外部事件、日志请求或它们的组合。
TimeBasedRollingPolicy实现了该接口TriggeringPolicy,即TimeBasedRollingPolicy既是 RollingPolicy 也是 TriggeringPolicy
3.5.2.3 Filter
过滤器,过滤满足条件或者不满足条件的日志。
允许组合使用,可配置多个。
过滤器有很多,只介绍两种常用的LevelFilter、ThresholdFilter。
使用示例如下
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- deny all events with a level below INFO, that is TRACE and DEBUG -->
<!-- 拒绝所有级别低于 INFO 的, 也就是 TRACE 和 DEBUG -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
LevelFilter属性如下:
3.5.2.4 Encoder
指定输出日志格式化和字符集
3.6 RollingFileAppender完整示例
<!--
springProperty: 读取spring环境ConfigurableEnvironment配置,即application.yml或者application.peroperties中的配置
-->
<springProperty name="LOG_FILE_PATH" source="logging.file.path" defaultValue="logs/case-logback"/>
<springProperty name="FILE_LOG_PATTERN" source="logging.pattern.file"
defaultValue="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p --- [%30.30t] %-40.40logger{39} : %m%n"/>
<!-- 所有日志 -->
<appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 日志文件名称 -->
<file>${LOG_FILE_PATH}/${APPLICATION_NAME:-case-logback}.all.log</file>
<append>true</append>
<!--
容量和时间滚动策略 SizeAndTimeBasedRollingPolicy
https://logback.qos.ch/manual/appenders.html#SizeAndTimeBasedRollingPolicy
-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--
日志文件文件名分片正则
1、%d:日期,默认 yyyy-MM-dd,可以通过 %d{yyyy-MM-dd, UTC} 来自定义日期格式化,可以指定时区timezone,底层通过java.text.SimpleDateFormat处理
2、%i:自增序号,从0开始
3、.gz:文件后缀判断是否开启压缩,支持.gz 和 .zip
-->
<fileNamePattern>
${LOG_FILE_PATH}/history/${APPLICATION_NAME:-case-logback}.all.%d{yyyy-MM-dd-HH-mm}.%i.log.gz
</fileNamePattern>
<!--
单个日志文件的最大容量,默认单位 Bytes,可指定 KB、MB、GB
-->
<maxFileSize>1MB</maxFileSize>
<!--
历史日志最大保留时长,以 %d{yyyy-MM-dd-HH-mm} 配置的时间粒度处理,例如:本配置精确到分,则为最大保留3分钟的日志文件,超出3分钟的日志分片异步删除
0:禁用,即 不保留历史日志
-->
<MaxHistory>3</MaxHistory>
<!-- 日志文件总计最大容量
MaxHistory 时间内,但是总容量超过该值,自动删除最老的日志文件
例如: 本配置,保留3分钟(MaxHistory)的历史日志,但是3分钟内所有日志文件总容量超过 2MB (totalSizeCap)的,从最老的开始删除
-->
<totalSizeCap>2MB</totalSizeCap>
<!-- 启动时清理日志 -->
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>${FILE_LOG_PATTERN}</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
四、< logger >标签详解
4.1 概述
如果需要定制指定模块或者类的日志级别,可以通过< logger >标签来实现,通过其name属性指定包或者类全路径即可。
(1)< appender >必须在< root >或者< logger >中通过< appender-ref >引用相应的< appender >才生效。< logger >、< root >会将相关的日志事件委托给< appender >执行日志的输出(控制台或者文件)
(2)< logger >是有父子关系的,父子关系是根据name属性的层级来确定的
(3)< root >是一个特殊的< logger > ,其name=“ROOT”,是所有< logger >的祖先节点。
如< logger name=“com.qbhj.logback.controller”>,其父子关系如下:
< logger name=“ROOT”>
└─< logger name=“com”>
│ └─< logger name=“com.qbhj”>
│ │ └─< logger name=“com.qbhj.logback”>
│ │ │ └─< logger name=“com.qbhj.logback.controller”>
4.2 属性说明
(1)name:指定包或者类全路径,则该< logger >的配置就对其生效,默认使用< root >的日志配置。
(2)level:日志级别。若自身没设置 level 则使用其父Logger的level;若父级都没设置,则使用< root >节点的,< root >不配置则其默认级别level为DEBUG
(3)additivity:是否允许父级< logger >打印自身name指定范围内的日志。若允许,父级和子级会重复打印日志,不允许则只打印子级的日志。建议配置为false。
4.3 appender-ref
(1)< logger >由属性和子元素< appender-ref >2个部分构成,日志输出是< appender-ref >所引用的< appender >来执行的;
(2)每个logger可以配置任意(含0)个< appender-ref >;
(3)语法:ref=appender_name,声明 < appender >的name属性值;
4.4 使用示例
<!-- 建议配置为false,避免日志重复输出 -->
<logger name="com.qbhj" level="INFO" additivity="false">
<!-- 可配置 N 个appender-ref -->
<appender-ref ref="CONSOLE"/>
<appender-ref ref="appender1"/>
<appender-ref ref="appender1"/>
</logger>
<logger name="com.qbhj.logback" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="com.qbhj.logback.empty" additivity="false">
</logger>
五、< root >使用
5.1 概述
< root >的本质是一个名为ROOT的特殊logger,即< logger name=“ROOT” >,是所有logger的根节点。
5.2 属性
5.3 使用示例
<root level="DEBUG">
<!-- 控制台 -->
<appender-ref ref="CONSOLE"/>
<!-- 文件 -->
<appender-ref ref="FILE_ALL"/>
<appender-ref ref="FILE_WARN"/>
<appender-ref ref="FILE_ERROR"/>
</root>
.
.
.
.
.
.
版权声明:本文主要内容参考了CSDN博主「柒杯红酒」的三篇原创文章,原文链接:
https://blog.csdn.net/weixin_43582081/article/details/130031936?spm=1001.2014.3001.5502
https://blog.csdn.net/weixin_43582081/article/details/129909620
https://blog.csdn.net/weixin_43582081/article/details/129780600
感谢CSDN博主「柒杯红酒」的分享。