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,分别为 CONSOLE
和 FILE
,这两个 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,日志信息输出到 file
和 console
定义的两个 Appender 中。
9、总结
本文简要介绍了 SpringBoot Logback 日志的相关知识点,包括 Logback 架构、Logback 配置文件、日志级别、控制台输出日志、文件输出日志、日志文件滚动、异步输出日志等内容。Logback 具有灵活的配置及强大的功能,可以灵活地控制日志信息的输出。在实际的开发中,应该根据具体的需求来选择合适的日志输出方式,并且注意合理配置日志级别、日志输出格式和日志文件的滚动策略等。
原文始发于微信公众号(小虎哥的技术博客):【强大而灵活】掌握 SpringBoot Logback 日志输出的技巧与方法
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/169640.html