logback日志管理工具超详细使用方法及示例

前言

本文详细介绍了日志管理工具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博主「柒杯红酒」的分享。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个简化了应用程序开发的框架,提供了快速构建和运行独立的、生产级的Spring应用程序的能力。Logback是一种日志记录框架,它是由Ceki Gülcü创建的,是Log4j的继任者。Logback支持异步日志记录和策略,具有高性能和低延迟的特点。 而Logstash是一个高度可扩展的开源日志收集和处理工具,它可以从各种数据源收集日志,并将其存储到中央存储库中。使用Logstash,我们可以将Spring Boot应用程序的日志输出发送到集中式日志服务器进行集中管理和处理。 在Spring Boot中,我们可以集成Logback和Logstash来处理应用程序的日志。我们可以通过在项目的依赖管理文件中引入相应的依赖,例如: ```xml <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </dependency> <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> </dependency> ``` 然后,我们可以通过配置Logback来指定日志的输出格式和目标。我们可以使用Logstash提供的编码器来将日志信息格式化为JSON格式,并将其发送到Logstash服务器。配置示例如下: ```xml <configuration> <appender name="logstash" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="net.logstash.logback.encoder.LogstashEncoder" /> </appender> <root level="info"> <appender-ref ref="logstash" /> </root> </configuration> ``` 通过以上配置,我们可以将Spring Boot应用程序的日志输出到控制台,并通过Logstash将日志发送到集中式日志服务器进行集中处理和存储。这样可以方便我们对日志进行监控、检索和分析,有助于排查和解决应用程序中的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值