【强大而灵活】掌握 SpringBoot Logback 日志输出的技巧与方法

1、Logback 简介

Logback 是一个使用 Java 语言编写的、开源的、高性能的日志框架,是 Log4j 日志框架的继承者和更新版本。Logback 支持多种日志级别,包括 TRACE、DEBUG、INFO、WARN、ERROR 等,能够满足大多数应用程序对于日志的需求。Logback 的优势在于它同时具有高度的可靠性、强大的灵活性以及优秀的性能,被广泛应用于企业级应用中。

2、Logback 架构

Logback 的架构主要由三个核心组件组成:Logger、Appender 和 Layout。其中,Logger 用于记录 Log,Appender 用于将 Log 输出到控制台或文件,Layout 用于定义 Log 输出格式。下面简要介绍一下这三个概念。

Logger

Logger 相当于一个记录器,用于产生 Log。Logger 有一个与之关联的 Log Level,表示记录 Log 要记录的最小等级。Logger 可以选择是否记录它接收到的 Log,如果记录的 Log Level 低于 Logger 的 Log Level 则不记录。多个 Logger 可以形成一颗 Logger 的层次结构。

Appender

Appender 用于配置 Log 输出的目的地。Log 可以输出到控制台,文件,远程服务器等等。每个 Appender 都有一个 Layout,用于格式化 Log 输出。一个 Logger 可以由多个 Appender 处理 Log 事件,例如,一个 Logger 可以将所有 Error Level 的 Log 信息输出到一个文件中,同时将其他 Level 的 Log 输出到控制台。

Layout

Layout 用于格式化 Log 的输出方式。Layout 的作用是对 Log 进行格式化,然后由 Appender 输出。在 Layout 中可以定义 Log 的输出格式,比如时间,线程名称,Log Level 和 Log 的正文内容等。

3、Logback 配置文件

Logback 的配置文件使用 XML 或者 Groovy 格式编写,一般命名为 logback.xml 或者 logback.groovy。配置文件中包括了 Logger、Appender 和 Layout 等标签。下面是一个配置文件的示例:

<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
      <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</Pattern>
    </layout>
  </appender>
  
  <root level="debug">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

上面示例中,定义了一个名为 STDOUT 的 Appender,它是 ConsoleAppender 类型,用于将日志信息输出到控制台上。同时定义了一个根 Logger,日志级别为 debug,并将日志信息输出到 STDOUT Appender 中。Layout 标签用于定义日志信息的输出格式。

4、日志级别

Logback 日志级别按照从低到高排列为:TRACE < DEBUG < INFO < WARN < ERROR。默认情况下,Logback 将所有级别的日志信息都输出到控制台上。

在应用程序中,可以通过设置 Logger 的级别,或者在代码中设置 Log 的级别来限制输出的 Log 级别。例如,使用 RootLogger 将 ERROR 和 WARN 输出到 console,而其他的 Log 信息只输出到 file,示例代码如下:

<configuration>
  <!-- 控制台输出 -->
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
      <Pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</Pattern>
    </layout>
  </appender>
  
  <!-- 日志文件输出 -->
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>logs/test-%d{yyyy-MM-dd}.log.zip</fileNamePattern>
      <maxHistory>60</maxHistory>
    </rollingPolicy>
    <layout class="ch.qos.logback.classic.PatternLayout">
      <Pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</Pattern>
    </layout>
  </appender>
  
  <!-- 控制日志输出级别 -->
  <root level="ERROR">
    <appender-ref ref="CONSOLE" />
  </root>
  
  <!-- 控制业务日志输出级别 -->
  <logger name="com.example.demo" level="INFO" additivity="false">
    <appender-ref ref="FILE" />
  </logger>
</configuration>

在上面的示例中,控制台输出的日志级别为 ERROR,而 com.example.demo package 下的日志输出级别为 INFO,并且只输出到文件中。

5、控制台输出日志

控制台输出是 Logback 默认的输出方式,当应用程序中存在 Logback 依赖时,即可自动输出日志信息到控制台。常用的 ConsoleAppender 配置如下:

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d %5p %c{1}:%L - %m%n</pattern>
    </encoder>
</appender>

上面示例中,使用 ch.qos.logback.core.ConsoleAppender 配置一个输出到控制台的 Appender,并定义了日志输出的格式,控制台输出类似于如下格式:

2023-07-20 10:05:29 INFO  com.xxx.xxxx.Test:24 - hello!

6、文件输出日志

将日志输出到文件中,是LogBack的常用输出方式之一。Logback 支持多种文件滚动方式,如按照时间、文件大小、数量等。以下是常用的文件输出相关配置:

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <fileNamePattern>logs/test-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
        <maxFileSize>100MB</maxFileSize>
        <maxHistory>180</maxHistory>
        <totalSizeCap>5GB</totalSizeCap>
    </rollingPolicy>
</appender>

上面示例中,采用 ch.qos.logback.core.rolling.RollingFileAppender 配置一个输出到文件的 Appender,并且配置了文件滚动策略。<rollingPolicy> 中指定的是文件滚动的策略,在示例中指定的是按照时间和文件大小来切换日志文件,每个日志文件的大小不超过100MB,每天产生一个日志文件,最多维护180个工作日的日志文件,并且最多存储 5GB 的日志文件。文件日志输出如下所示:

2023-07-25 12:16:56,750 INFO  [main] com.xxx.xxx.Test - this is a info log message

7、日志文件滚动

为了避免日志文件过大,影响系统性能,可以设置 Logback 日志文件的滚动策略。Logback 支持按照时间、文件大小和文件数量等维度来滚动日志文件。常用的 TimeBasedRollingPolicy 配置可使日志文件按照时间进行滚动:

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>log/test-%d{yyyy-MM-dd}.log</fileNamePattern>
        <maxHistory>30</maxHistory>
    </rollingPolicy>
    <encoder>
        <pattern>%d %5p [%t] - %msg%n</pattern>
    </encoder>
</appender>

上面示例中,配置了一个按照时间滚动的 RollingFileAppender,并且指定了最多存储30天的日志文件。每天产生的日志文件会按照 log/test-yyyy-MM-dd.log 的命名格式进行存储。日志文件存储的 Example 如下:

test-2023-07-07.log
test-2023-07-08.log
test-2023-07-09.log
test-2023-07-10.log

8、异步输出日志

在高并发系统中,日志输出是很容易成为性能瓶颈的。为了减少对线程的阻塞,提高系统性能,Logback 提供了异步输出日志的方式,可以将日志输出到内存缓存中,然后在后台异步的将日志输出到指定的 Appender 中。常用的异步输出方式有 AsyncAppender 和 AsyncLogger。

AsyncAppender

AsyncAppender 可以将日志事件发送到一个或多个其他 Appender 中,可以将日志事件异步的转发到指定的 Appender,从而提高日志输出的效率。

配置 AsyncAppender 示例:

<appender name="async" class="ch.qos.logback.classic.AsyncAppender">
    <appender-ref ref="CONSOLE" />
    <appender-ref ref="FILE" />
</appender>

上面示例中, async Appender 中定义了两个 Appender,分别为 CONSOLEFILE,这两个 Appender 都会输出日志信息。ch.qos.logback.classic.AsyncAppender 支持多个 Appender,可以将输出的日志转发到多个目标中。

AsyncLogger

AsyncLogger 是 Logback 1.2.0 版本中新增的一个特性。与异步输出方式类似,AsyncLogger 也可以在后台异步输出日志信息,提高系统性能和吞吐量。不同的是,AsyncLogger 是指定每个 Logger 所使用的线程池,可以对每个 Logger 使用不同的线程池,实现更加细致的控制。

可以通过启用 AsyncLogger 来配置异步输出的 Logger,示例配置如下:

<configuration debug="true">
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/spring-boot-async.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/spring-boot-async-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>7</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d %p %c{1.} [%t] %m%n</pattern>
        </encoder>
    </appender>
    <logger name="com.example" level="INFO" additivity="false">
        <appender-ref ref="file"/>
        <appender-ref ref="console"/>
    </logger>
    <root level="INFO">
        <appender-ref ref="console"/>
    </root>
</configuration>

上面示例中,定义了两个 Appender,一个是输出到控制台的 console,另一个是输出到文件中的 file。还定义了一个名为 com.example 的 Logger,级别为 INFO,日志信息输出到 fileconsole 定义的两个 Appender 中。

9、总结

本文简要介绍了 SpringBoot Logback 日志的相关知识点,包括 Logback 架构、Logback 配置文件、日志级别、控制台输出日志、文件输出日志、日志文件滚动、异步输出日志等内容。Logback 具有灵活的配置及强大的功能,可以灵活地控制日志信息的输出。在实际的开发中,应该根据具体的需求来选择合适的日志输出方式,并且注意合理配置日志级别、日志输出格式和日志文件的滚动策略等。


原文始发于微信公众号(小虎哥的技术博客):【强大而灵活】掌握 SpringBoot Logback 日志输出的技巧与方法

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/169640.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!