【Java日志系列】Logback日志框架

目录

前言

一、Logback简介

二、Logback组件

三、快速入门

四、配置文件的使用

[1. 配置文件中的标签](#1. 配置文件中的标签)

[1.1 logger标签](#1.1 logger标签)

[1.2 root标签](#1.2 root标签)

[1.3 appender标签](#1.3 appender标签)

[1.4 filter标签](#1.4 filter标签)

[1.5 encoder标签](#1.5 encoder标签)

[1.6 property标签](#1.6 property标签)

[2. 常见的Appender](#2. 常见的Appender)

[2.1 ConsoleAppender](#2.1 ConsoleAppender)

[2.2 FileAppender](#2.2 FileAppender)

[2.3 RollingFileAppender](#2.3 RollingFileAppender)

[2.3.1 TimeBasedRollingPolicy](#2.3.1 TimeBasedRollingPolicy)

[2.3.2 FixedWindowRollingPolicy](#2.3.2 FixedWindowRollingPolicy)

[3. 异步日志](#3. 异步日志)

总结


前言

日志是软件开发中不可或缺的一部分,它不仅能够帮助开发者了解应用程序运行的状态,还能在出现问题时提供诊断信息。Logback 是一个高效、灵活的日志框架,它由 Log4j 的创始人 Ceki Gülcü 开发,并且是 SLF4J (Simple Logging Facade for Java) 的默认实现。Logback 分为三个模块:core、classic 和 access,其中 classic 模块提供了丰富的日志功能。本文将介绍 Logback 的基本概念,包括其组件结构、快速入门、配置文件的使用、常见的 Appender 以及如何配置异步日志记录等功能。

一、Logback简介

Logback是由Log4j创始人设计的又一个开源日志组件,当前分为三个模块:logback-core、logback-classic和logback-access,其中logback-core是其他两个模块的基础模块。logback-classic是log4j的一个改良版本,此外logbac-classic完整实现SLF4J API,使你开以很方便地更换成其他日志系统如log4j或JDK14 Loggin。logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。

二、Logback组件

**Logger:**日志的记录器,主要用于存放日志对象,也可以定义日志类型、级别。

Appender:用于指定日志输出的目的地,目的地可以是控制台、文件、数据库等等。

**Layout:**负责把事件转换为字符串,格式化的日志信息的输出。在Logback中Layout对象封装在encoder中,也就是说我们配置文件中使用的encoder其实就是Layout。

三、快速入门

首先,我们导入slf4j日志门面和logback的日志实现依赖:

XML 复制代码
<!-- slf4j依赖 -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>2.0.13</version>
</dependency>
<!-- logback日志实现  logback-classic已经涵盖logback-core这个依赖了 -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.5.6</version>
</dependency>

编写如下入门代码:

java 复制代码
@Test
public void testQuick() {
    Logger logger = LoggerFactory.getLogger(LogbackTest.class);
    logger.error("error信息");
    logger.warn("warn信息");
    logger.info("info信息");
    logger.debug("debug信息");
    logger.trace("trace信息");
}

运行结果如下图所示:

**补充:**logback有5种日志输出级别。分别是trace < debug < info < warn < error,其中debug是默认的日志级别。

四、配置文件的使用

Logback提供了logback.groovy、logback-test.xml和logback.xml这三种配置文件(如果都不存在则采用默认的配置)。一般来说,我们会使用logback.xml来作为配置文件。Logback配置文件一般在springboot项目的src/main/resources目录下创建名为logback-spring.xml的文件。

1. 配置文件中的标签

1.1 logger标签

logger是日志记录器,用来控制要输出哪些日志记录语句,对日志信息进行级别限制。有level属性、name属性、additivity属性,其中name属性必须要写,指定到哪一个类或者哪一个包,additivity表示是否向上一层传递打印信息,默认为true。可以包含 appender-ref 元素。下面是使用示例:

XML 复制代码
<configuration>
    <logger level="ERROR" name="com.example.testlog.LogTest" additivity="false">
        <appender-ref ref="STDOUT"></appender-ref>
    </logger>
</configuration>

1.2 root标签

root标签指定最基础的的日志输出级别,它只有一个level属性,可以包含 appender-ref 元素。

level属性可以选择,ALL、TRACE、DEBUG、INFO、WARN、ERROR、NULL、OFF、INHERITED,下面是使用示例:

XML 复制代码
<configuration>
    <root level="debug">
        <appender-ref ref="STDOUT"></appender-ref>
    </root>
</configuration>

1.3 appender标签

appender就是附加器,日志记录器会将输出的任务交给附加器完成,不同的附加器会将日志输出到不同的地方,例如控制台、文件、网络等。下面是使用示例:

XML 复制代码
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
</configuration>

补充(常见的附加器)

控制台附加器: ch.qos.logback.core.ConsoleAppender。
文件附加器: ch.qos.logback.core.FileAppender。
**滚动文件附加器:**ch.qos.logback.core.rolling.RollingFileAppender,属性有name、class,class用来指定附加器,name来表示当前附件器的名字。其他需要指定附件器的标签,可以通过appender-ref标签中的ref来指定。可以包含encoder元素、fileter元素等。

1.4 filter标签

filter是过滤器,过滤器是附件器的一个组件,它是用于判断附件器是否输出日志的。一个附件器可以包含多个过滤器。过滤器只能有三个值,DENY、NEUTRAL、ACCEPT。DENY是不输出日志,NEUTRAL是不决定是否输出日志,ACCEPT是输出日志。

在filter中 ,可以有三个元素,level元素、onMatch元素和onMismatch元素。其中,<level>用于设置过滤级别,<onMatch>用于配置符合过滤条件的操作,<onMismatch>用于配置不符合过滤条件的操作。下面是使用示例:

XML 复制代码
<configuration>
     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <filter>
            <level>info</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
</configuration>

1.5 encoder标签

encoder最主要的就是pattern标签,用于控制输出日志的格式,常见的一些日志的输出格式如下面所示:

  • %-10level 日志级别 案例为设置10个字符,左对齐
  • %d {yyyy-MM-dd HH:mm:ss.SSS} 日期
  • %c 当前类全限定名
  • %M 当前执行日志的方法
  • %L 行号
  • %thread 线程名称
  • %m 或者%msg 信息
  • %n 换行
  • %logger 输出日志的类名
  • %logger{length} 对输出日志的类名缩写展示

下面是一个encoder标签及输出格式的使用示例:

XML 复制代码
<encoder>
     <pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n</pattern>
</encoder>

1.6 property标签

property标签用来定义变量, 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值,下面是一个使用示例:

XML 复制代码
<property name="HOME" value="../log">

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <file>${HOME}/log.log</file>
</appender>

2. 常见的Appender

2.1 ConsoleAppender

把日志添加到控制台,有以下子节点:

  • <encoder>:对日志进行格式化。
  • <target>:字符串 System.out 或者 System.err ,默认 System.out 。
XML 复制代码
<configuration>  
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">  
    <encoder>  
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>  
    </encoder>  
  </appender>  
  <root level="DEBUG">  
    <appender-ref ref="STDOUT" />  
  </root>  
</configuration>  

2.2 FileAppender

把日志添加到文件,有以下子节点:

  • <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
  • <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
  • <encoder>:对记录事件进行格式化。
  • <prudent>:如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是false。
XML 复制代码
<configuration>  
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">  
    <file>testFile.log</file>  
    <append>true</append>  
    <encoder>  
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>  
    </encoder>  
  </appender>  
  <root level="DEBUG">  
    <appender-ref ref="FILE" />  
  </root>  
</configuration>  

**补充:**除了将文件以.log的文本形式输出外,我们还可以将文件输出成html文件,相关配置如下图所示:

2.3 RollingFileAppender

滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。有以下子节点:

  • <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
  • <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
  • <encoder>:对记录事件进行格式化。
  • <rollingPolicy>:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。
  • <triggeringPolicy>: 告知 RollingFileAppender 何时激活滚动。
  • <prudent>:当为true时,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有两个限制:不支持也不允许文件压缩;不能设置file属性,必须留空。

其中,对于滚动策略RollingPolicy,可以有以下两个策略:

2.3.1 TimeBasedRollingPolicy

TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责触发滚动。有以下子节点:

  • <fileNamePattern>:必要节点,包含文件名及"%d"转换符, "%d"可以包含一个java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}。如果直接使用 %d,默认格式是 yyyy-MM-dd。RollingFileAppender 的file子节点可有可无,通过设置file,可以为活动文件和归档文件指定不同位置,当前日志总是记录到file指定的文件(活动文件),活动文件的名字不会改变;如果没设置file,活动文件的名字会根据fileNamePattern 的值,每隔一段时间改变一次。"/"或者"\"会被当做目录分隔符。
  • <maxHistory>:可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每个月滚动,且<maxHistory>是6,则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除。
2.3.2 FixedWindowRollingPolicy

FixedWindowRollingPolicy: 根据固定窗口算法重命名文件的滚动策略。有以下子节点:

  • <minIndex>:窗口索引最小值
  • <maxIndex>:窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为12。
  • <fileNamePattern >:必须包含"%i"例如,假设最小值和最大值分别为1和2,命名模式为 mylog%i.log,会产生归档文件mylog1.log和mylog2.log。还可以指定文件压缩选项,例如,mylog%i.log.gz 或者 没有log%i.log.zip

下面是一个简单的示例,表示每天生成一个日志文件,保存30天的日志文件。

XML 复制代码
<configuration>   
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">   
     <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">   
      <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>   
      <maxHistory>30</maxHistory>    
    </rollingPolicy>   
     <encoder>   
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>   
    </encoder>   
  </appender>    
  <root level="DEBUG">   
    <appender-ref ref="FILE" />   
  </root>   
</configuration>  

3. 异步日志

所谓异步日志,系统会为日志操作单独分配出来一个线程,原来用来执行当前方法的主线程会继续向下执行,两个线程争夺CPU的使用权,在实际项目开发中,越大的项目对于日志的记录就越庞大,为了保证项目的执行效率,异步日志是一个很好的选择。下图是异步日志的一个使用示例:

总结

在本文中,我们介绍了 Logback 的基本概念和使用方法。从 Logback 的架构开始,我们了解到它分为 core、classic 和 access 三个模块,以及它与 SLF4J 的关系。接着通过快速入门的例子,展示了如何在项目中引入 Logback 并进行日志记录。随后,我们详细探讨了 Logback 的配置文件,包括常用的标签和属性,以及如何配置不同的 Appender 实现不同的日志输出需求。最后,我们还介绍了如何利用异步日志来提高程序性能。无论是简单的需求还是复杂的应用场景,Logback 都能提供强大的支持。随着对日志需求的增长和技术的发展,Logback 仍然是一个值得信赖的选择。

相关推荐
Crossoads43 分钟前
【汇编语言】端口 —— 「从端口到时间:一文了解CMOS RAM与汇编指令的交汇」
android·java·汇编·深度学习·网络协议·机器学习·汇编语言
老马啸西风44 分钟前
NLP 中文拼写检测纠正论文-02-2019-SOTA FASPell Chinese Spell Checke github 源码介绍
java
向宇it1 小时前
【从零开始入门unity游戏开发之——C#篇26】C#面向对象动态多态——接口(Interface)、接口里氏替换原则、密封方法(`sealed` )
java·开发语言·unity·c#·游戏引擎·里氏替换原则
@菜鸟进阶记@1 小时前
java根据Word模板实现动态填充导出
java·开发语言
卖芒果的潇洒农民1 小时前
Lecture 6 Isolation & System Call Entry
java·开发语言
SomeB1oody1 小时前
【Rust自学】6.1. 定义枚举
开发语言·后端·rust
SomeB1oody1 小时前
【Rust自学】5.3. struct的方法(Method)
开发语言·后端·rust
Amarantine、沐风倩✨2 小时前
设计一个监控摄像头物联网IOT(webRTC、音视频、文件存储)
java·物联网·音视频·webrtc·html5·视频编解码·七牛云存储
Kisorge2 小时前
【C语言】指针数组、数组指针、函数指针、指针函数、函数指针数组、回调函数
c语言·开发语言
路在脚下@3 小时前
spring boot的配置文件属性注入到类的静态属性
java·spring boot·sql