Logback浅浅学习一下

134 阅读5分钟

写这篇文章主要是记录一下自己的学习。原由是工作中突然被指派去调整一下日志。当时一想,之前学的好像都忘光了,这可抓瞎了。咋办呢?学呗,再复习一下,回顾了一下知识点,慢慢就又上手了。

浅浅记录一下 Logback是一种基于Java的日志记录框架,是log4j框架的继承者。Logback提供了一种高效、可配置和灵活的方式来记录日志,并且可以非常容易地与其他Java框架集成。本文将介绍Logback的基本概念、配置和用法。

Logback的基本概念

Logback由三个模块组成:

  • logback-core:提供了日志记录的核心功能。
  • logback-classic:建立在logback-core之上,提供了与log4j兼容的API。
  • logback-access:提供了HTTP访问日志功能。

Logback的核心组件包括LoggerAppenderLayout

  • Logger是Logback中最重要的组件,它负责记录日志消息。Logger有一个层次结构,每个Logger都有一个名称,这个名称可以包含多个单词,用"."分隔。
    • 例如,一个Logger的名称可以是"com.example.app",它有一个父Logger"com.example",它有一个更高级别的Logger"com"。当Logger记录一条消息时,它会沿着Logger层次结构向上查找,直到找到一个具有Appender的Logger,然后将消息发送到这个Appender。
  • Appender是负责将日志消息发送到目的地的组件。
    • 例如,一个Appender可以将日志消息写入文件、控制台、数据库或远程服务器。Logback提供了多种类型的Appender,包括ConsoleAppender、FileAppender、RollingFileAppender、SMTPAppender、SocketAppender等。
  • Layout是负责格式化日志消息的组件。它将日志消息的各个部分组合成一条完整的日志记录。
    • 例如,一个Layout可以将日志消息格式化为JSON、XML、HTML、纯文本等格式。

Logback的特点

Logback具有以下几个特点:

  • 高性能:Logback使用异步日志记录,能够处理高负载场景,避免对应用程序的性能影响。
  • 可靠性高:Logback使用单线程模型,保证了日志记录的顺序和完整性。
  • 灵活性强:Logback提供了丰富的配置选项,可以根据不同的需求进行灵活配置。
  • 可扩展性好:Logback的架构清晰,易于扩展和定制。

Logback的配置

  1. 首先看一个正常的配置

Logback的配置文件通常被称为logback.xml,它定义了Logger、Appender和Layout的配置。Logback的配置文件需要放置在classpath根目录下。下面是一个简单的logback.xml配置文件的示例:

<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
  </appender>
  
  <logger name="com.example" level="DEBUG">
    <appender-ref ref="STDOUT" />
  </logger>
  
  <root level="INFO">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

解释一下:

  • appender元素定义了一个名为STDOUT的控制台输出Appender,使用的是ConsoleAppender类- encoder元素定义了输出格式的模式,使用了%-4relative、[%thread]、%-5level、%logger{35}和%msg%n等占位符。
  • logger元素定义了名为com.example的Logger对象,其级别为DEBUG,它关联了STDOUT的Appender。
  • root元素是Logger对象的根元素,它定义了日志级别为INFO,同时也关联了STDOUT的Appender。

这个配置文件的含义是:当一个Logger对象的名字以com.example开头时,它将会使用名为STDOUT的Appender输出DEBUG级别及以上的日志信息;当一个Logger对象的名字不以com.example开头时,将会使用root元素定义的默认Appender输出INFO级别及以上的日志信息。

  1. 先看一个稍微不正常的配置
<root level="DEBUG">
  <appender-ref ref="CONSOLE" />
</root>

<logger name="com.example" level="INFO">
  <appender-ref ref="FILE" />
</logger>

举个例子:

  • 如果一个日志事件的Logger对象名称为"com.example",并且级别为DEBUG,那么它将只能匹配root元素,并且使用root元素关联的Appender。
  • 如果一个日志事件的Logger对象名称为"com.example",并且级别为INFO,那么它将只匹配到logger元素,并且使用logger元素关联的Appender。

为什么为什么级别为DEBUG,就会匹配root???

首先明确一点在logback中,如果一个日志事件的级别低于某个Logger对象或root元素的级别,那么这个日志事件就不会被记录。

因此,在默认情况下,如果一个Logger对象没有定义级别,它会继承其父Logger对象的级别,直到找到定义了级别的Logger对象或root元素。

对于上面的例子,假设一个日志事件的级别为DEBUG,因为root元素定义的级别为DEBUG,因此这个日志事件将会被root元素匹配到,并且记录到root元素关联的Appender中。

同时,因为logger元素定义的级别为INFO,DEBUG级别低于INFO级别,所以这个日志事件不会被logger元素匹配到。但是,如果这个日志事件的级别为INFO,那么它将会被logger元素匹配到,并且记录到logger元素关联的Appender中。

  1. 再看一个稍微不正常的配置
<root level="INFO">
  <appender-ref ref="CONSOLE" />
</root>

<logger name="com.example" level="INFO">
  <appender-ref ref="FILE" />
</logger>

举个例子:

  • 如果一个日志事件的Logger对象名称为"com.example",并且级别为INFO,那么既能够匹配root元素,也能够匹配logger元素。
  • 但是他只会使用root元素关联的Appender记录日志。

为什么为什么会使用root元素关联的Appender记录日志。???

如果一个日志事件同时匹配到root元素和logger元素,那么只有匹配顺序在前的Appender会被执行。

在这个例子中,因为root元素在logger元素之前定义,所以一个级别为INFO的日志事件会被root元素匹配到,并且使用root元素关联的Appender记录日志。如果将logger元素定义放在root元素之前,那么一个级别为INFO的日志事件将会被logger元素匹配到,并且使用logger元素关联的Appender记录日志。

日志级别

Logback提供了五种日志级别,由低到高分别是:TRACE、DEBUG、INFO、WARN、ERROR。

总结

logback是一个功能强大的Java日志框架,提供了高度的可配置性和灵活性。通过配置文件的方式,可以轻松地对logback进行配置和管理。同时,logback的使用也非常简单,只需要创建Logger对象并调用它的方法即可记录日志信息。