系列文章目录

学习Java日志框架之——搞懂JUL(java.util.logging)
学习Java日志框架之——搞懂log4j
学习Java日志框架之——搞懂日志门面(JCL+SLF4J)
学习日志框架之——搞懂logback
学习日志框架之——log4j2入门
log4j2扩展——打印自定义日志输出格式,将日志输出为json或自定义

一、logback概述

1、Logback简介

Logback是由log4j创始人设计的又一个开源日志组件。
Logback当前分成三个模块:logback-core,logback- classic和logback-access。

logback-core是其它两个模块的基础模块。

logback-classic是log4j的一个改良版本。此外logback-classic完整实现SLF4J API。使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging。

logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。

2、Logback中的组件

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

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

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

3、Logback配置文件

Logback提供了3种配置文件

  • logback.groovy
  • logback-test.xml
  • logback.xml(常用)
    如果都不存在则采用默认的配置

4、日志输出格式

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

二、使用示例

1、依赖导入

logback-core是logback-classic的基础模块,logback-classic已经涵盖logback-core这个依赖了,根据maven依赖的传递性,不需要重复导入,只导入一个logback-classic即可。

<!-- slf4j日志门面 -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
</dependency>
<!-- logback日志实现 -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>

2、入门案例

logback一般通过logback.xml进行配置
配置读取步骤:
(1) 尝试在classpath下查找文件logback-test.xml
(2) 如果文件不存在,则查找文件logback.xml
(3) 如果两个文件都不存在,则用BasicConfigurator自动对自己进行配置,把记录输出到控制台
logback

有5种级别的日志输出,分别是trace < debug < info < warn < error。

// 使用slf4j门面,若不特殊指定,以下的示例都是这一段代码
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Logger logger = LoggerFactory.getLogger(LOGBACKTest01.class);
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");

通过信息打印,默认的日志级别是debug,trace信息没有打印出来。

3、配置文件基本使用

在resources下面,创建一份配置文件,命名为logback.xml,一切配置都是在根标签configuration中进行操作的。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--
        配置文件通用属性
        <property name="" value=""></property>
        所谓配置文件中的通用属性是为了让接下来的配置更加方便引用
        通过以${name}的形式,方便的取得value值
        通过取得的value值可以做文件的其他配置而使用
    -->

    <!--
        我们在此可以先做日志输出格式相关的配置
        %-10level  级别 案例为设置10个字符,左对齐
        %d{yyyy-MM-dd HH:mm:ss.SSS} 日期
        %c  当前类全限定名
        %M  当前执行日志的方法
        %L  行号
        %thread 线程名称
        %m或者%msg    信息
        %n  换行

        以property的形式将日志输出格式配置成为文件的通用的属性
        那么下面我们配置的输出方式中,就可以重复的引用该配置(以下的配置,对于输出格式就不用配置多次了)
    -->
    <property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L %thread %m%n"></property>

    <!-- 配置控制台appender -->
    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <!--
            表示对于日志输出目标的配置
            默认:System.out 表示以黑色字体输出日志
            设置:System.err 表示以红色字体输出日志
        -->
        <target>
            System.err
        </target>
        <!--
            配置日志输出格式
            手动配置格式的方式
            直接引入上述的通用属性即可
        -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!-- 格式引用通用属性配置,引用property的name属性 -->
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!--
        日志记录器
        配置root logger
        level:配置日志级别
        可以同时配置多个appender,做日志的多方向输出
    -->
    <root level="ALL">
        <!-- 引入appender,name属性 -->
        <appender-ref ref="consoleAppender"/>
    </root>

</configuration>
执行结果:
[ERROR] 2023-03-23 14:03:43.313 com.demo.logback.test01.LOGBACKTest01 test02 50 main error信息
[WARN ] 2023-03-23 14:03:43.324 com.demo.logback.test01.LOGBACKTest01 test02 51 main warn信息
[INFO ] 2023-03-23 14:03:43.325 com.demo.logback.test01.LOGBACKTest01 test02 52 main info信息
[DEBUG] 2023-03-23 14:03:43.325 com.demo.logback.test01.LOGBACKTest01 test02 53 main debug信息
[TRACE] 2023-03-23 14:03:43.325 com.demo.logback.test01.LOGBACKTest01 test02 54 main trace信息

4、将日志输出到文件

在文件中,默认是以追加日志的形式做记录。

属性:

  • <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
  • <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
  • <encoder>:对记录事件进行格式化。
  • <prudent>:如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。

配置文件新增以下配置:

<!-- 配置文件的输出路径 -->
<property name="logDir" value="D://test"></property>
<!-- 配置文件的appender 普通文件-->
<appender name="fileAppender" class="ch.qos.logback.core.FileAppender">
    <!-- 引入文件位置 -->
    <file>${logDir}/logback.log</file>
    <!-- 是否追加 -->
    <append>true</append>
    <!-- 设置输出格式 -->
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <pattern>${pattern}</pattern>
    </encoder>
</appender>

<!--
    日志记录器
    配置root logger
    level:配置日志级别
    可以同时配置多个appender,做日志的多方向输出
-->
<root level="ALL">
    <!-- 引入appender,name属性 -->
    <appender-ref ref="fileAppender"/>
</root>

5、将日志输出为一个html文件

这个html文件是由logback来帮我们控制样式以及输出的格式,内容由我们自己来指定。

<!--html专属pattern,去掉空格-->
<property name="pattern1" value="[%-5level]%d{yyyy-MM-dd HH:mm:ss.SSS}%c%M%L%thread%m%n"></property>
<!-- 配置文件的appender html文件 -->
<appender name="htmlFileAppender" class="ch.qos.logback.core.FileAppender">
    <file>${logDir}/logback.html</file>
    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
        <layout class="ch.qos.logback.classic.html.HTMLLayout">
            <pattern>${pattern1}</pattern>
        </layout>
    </encoder>
</appender>

<!--
    日志记录器
    配置root logger
    level:配置日志级别
    可以同时配置多个appender,做日志的多方向输出
-->
<root level="ALL">
    <!-- 引入appender,name属性 -->
    <appender-ref ref="htmlFileAppender"/>
</root>

6、日志拆分和归档压缩

属性

  • <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
  • <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
  • <rollingPolicy>:当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名。属性class定义具体的滚动策略类,"ch.qos.logback.core.rolling.TimeBasedRollingPolicy"是最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。
  • <fileNamePattern>:必要节点,包含文件名及“%d”转换符,“%d”可以包含一个java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}。如果直接使用 %d,默认格式是 yyyy-MM-dd。RollingFileAppender的file字节点可有可无,通过设置file,可以为活动文件和归档文件指定不同位置,当前日志总是记录到file指定的文件(活动文件),活动文件的名字不会改变;如果没设置file,活动文件的名字会根据fileNamePattern 的值,每隔一段时间改变一次。“/”或者“\”会被当做目录分隔符。
  • <maxHistory>:可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每个月滚动,且是6,则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除。"ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"是查看当前活动文件的大小,如果超过指定大小会告知RollingFileAppender 触发当前活动文件滚动。只有一个节点:
  • <maxFileSize>:这是活动文件的大小,默认值是10MB。
  • <prudent>:当为true时,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有两个限制,1不支持也不允许文件压缩,2不能设置file属性,必须留空。
  • <triggeringPolicy >: 告知 RollingFileAppender 合适激活滚动。“ch.qos.logback.core.rolling.FixedWindowRollingPolicy” 根据固定窗口算法重命名文件的滚动策略。
  • <minIndex>:窗口索引最小值
  • <maxIndex>:窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为12。
  • <fileNamePattern>:必须包含“%i”例如,假设最小值和最大值分别为1和2,命名模式为 mylog%i.log,会产生归档文件mylog1.log和mylog2.log。还可以指定文件压缩选项,例如,mylog%i.log.gz 或者 没有log%i.log.zip
  • <encoder>:对记录事件进行格式化。负责两件事,一是把日志信息转换成字节数组,二是把字节数组写入到输出流。PatternLayoutEncoder 是唯一有用的且默认的encoder ,有一个节点,用来设置日志的输入格式。使用“%”加“转换符”方式,如果要输出“%”,则必须用“\”对“%”进行转义。
<!-- 配置文件的appender 可拆分归档的文件 -->
<appender name="roll" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!-- 输入格式 -->
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <pattern>${pattern}</pattern>
    </encoder>
    <!-- 引入文件位置 -->
    <file>${logDir}/roll_logback.log</file>
    <!-- 指定拆分规则 -->
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <!-- 按照时间和压缩格式声明文件名 压缩格式gz 一般按天来拆分 %i为文件标号 -->
        <fileNamePattern>${logDir}/roll.%d{yyyy-MM-dd-HH-mm-ss}.log%i.gz</fileNamePattern>
        <!-- 按照文件大小来进行拆分 -->
        <maxFileSize>1KB</maxFileSize>
        <!-- 设置最大保存周期 -->
		<MaxHistory>30</MaxHistory>
    </rollingPolicy>
</appender>
<!--
    日志记录器
    配置root logger
    level:配置日志级别
    可以同时配置多个appender,做日志的多方向输出
-->
<root level="ALL">
    <!-- 引入appender,name属性 -->
    <appender-ref ref="roll"/>
</root>

(1)源码分析

我们查看RollingFileAppender类,有rollingPolicy属性:

public class RollingFileAppender<E> extends FileAppender<E> {
    File currentlyActiveFile;
    TriggeringPolicy<E> triggeringPolicy;
    RollingPolicy rollingPolicy;

RollingPolicy 接口有个实现类,就是SizeAndTimeBasedRollingPolicy,SizeAndTimeBasedRollingPolicy类中有maxFileSize属性。

fileNamePattern配置就在SizeAndTimeBasedRollingPolicy的父类RollingPolicyBase中,只要我们要使用到日志的拆分,FileNamePattern属性是必须要使用到了。

这些属性在类中都是以set方法的形式进行的赋值。我们在配置文件中配置的信息,其实找到的都是这些属性的set方法。

(2)TimeBasedRollingPolicy详解

TimeBasedRollingPolicy是rollingPolicy中最常见的轮转策略,它同时实现了RollingPolicy 和 TriggeringPolicy 接口。

属性
1. fileNamePattern(必填)

String类型,该属性定义了轮转时的属性名。它的值应该由文件名加上一个%d的占位符。%d应该包含java.text/SimpleDateFormat中规定的日期格式。如果忽略掉这个日期格式,默认文yyyy-MM-dd。轮转周期通过fileNamePattern推断出来的。可以指定多个 %d,但是只能有一个是主要的,用于推断轮转周期。其它的 %d 占位符必须通过 ‘aux’ 标记为辅助的。还可以通过 aFloder/test.%d{yyyy-MM-dd-HH, UTC}.log 来指定一个时区,如果指定的 timezone 不能被识别或者拼写错误,将会根据TimeZone.getTimeZone(String)方法指定为 GMT。

轮询实例

/wombat/foo.%d

每天轮转(晚上零点)。由于省略了指定 %d 的日期格式,所以默认为?yyyy-MM-dd。

/wombat/%d{yyyy/MM}/foo.txt:

每个月开始的时候轮转。

/wombat/foo.%d{yyyy-ww}.log:

每周的第一天(取决于时区)轮转。

/wombat/foo%d{yyyy-MM-dd_HH}.log:

每小时轮转。

/wombat/foo%d{yyyy-MM-dd_HH-mm}.log:

每分钟轮转。

/wombat/foo%d{yyyy-MM-dd_HH-mm, UTC}.log:

每分钟轮转,时间格式为UTC。

/foo/%d{yyyy-MM, aux}/%d.log:

每天轮转。

2. maxHistory

int类型,可选属性,用来控制最多保留多少数量的归档文件,将会异步删除旧的文件。当旧的归档文件被移除时,当初用来保存这些日志归档文件的文件夹也会在适当的时候被移除。比如,你指定按月轮转,指定 maxHistory = 6,那么 6 个月内的归档文件将会保留在文件夹内,大于 6 个月的将会被删除。

3. totalSizeCap

int类型,可选属性,用来控制所有归档文件总的大小。当达到这个大小后,旧的归档文件将会被异步的删除。使用这个属性时还需要设置 maxHistory 属性。而且,maxHistory 将会被作为第一条件,该属性作为第二条件。

4. cleanHistoryOnStart

boolean类型,如果设置为 true,那么在 appender 启动的时候,归档文件将会被删除。默认的值为 false。
归档文件的删除通常在轮转期间执行。但是,有些应用的存活时间可能等不到轮转触发。对于这种短期应用,可以通过设置该属性为 true,在 appender 启动的时候执行删除操作。

<!-- 滚动文件的方式生成日志日志文件,文件的存储位置通过file标签指定 -->
<!-- 通过encoder指定日志的生成格式,每个appender的日志格式都可以自定义,不用相同 -->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>/logback/log/test.log</file>
	<encoder>
    	<pattern>【logbck】%blue([requestId:%X{requestId:-syslogId}]) %d{yyyy-MM-dd HH:mm:ss.SSS} %red([%thread]) %5level - %msg%n</pattern>
    </encoder>
    <!-- 
    通过rollingPolicy设置日志滚动的策略,这是使用按照时间滚动
    fileNamePattern属性设置滚动生成文件的格式,这里设置的精确到天,也就是按照天滚动,如果时间设置精确到秒,就按秒来滚动
    maxHistory属性设定最大的文件数,比如按天滚动,这里设置了30天,在第31天日志生成的时候,第一天的日志就会被删掉
    -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
		<!--设置按天来滚动,前一天日志打印到23点59分,然后就一直没有请求日志,直到次日的1点才有新的日志进入。
                在0点到1点这个时间段,日志文件是不会滚动生成新的日志文件。因为滚动的动作是需要日志写入动作来触发。-->
    	<fileNamePattern>/logback/log/test-%d{yyyy-MM-dd}.log</fileNamePattern>
        <maxHistory>30</maxHistory>
    </rollingPolicy>
</appender>

(3)FixedWindowRollingPolicy详解

FixedWindowRollingPolicy是logback中根据固定窗口算法重命名文件的滚动策略。

属性
minIndex:窗口索引最小值

maxIndex:窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为20。

fileNamePattern:必须包含“%i”例如,假设最小值和最大值分别为1和2,命名模式为 mylog%i.log,会产生归档文件mylog1.log和mylog2.log。还可以指定文件压缩选项,例如,mylog%i.log.gz 或者 没有log%i.log.zip

<!-- 设置为按照索引的方式滚动,定义文件名称的时候使用%i作为占位符,滚动后会会用角标替换 -->
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
    <fileNamePattern>/logback/log/test-%i.log</fileNamePattern>
    <minIndex>1</minIndex>
    <maxIndex>3</maxIndex>
</rollingPolicy>
<!-- 指定文件最大尺寸,达到该尺寸,就触发rollingPolicy对应的策略,maxFileSize属性指定文件大小 -->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
	<maxFileSize>1MB</maxFileSize>
</triggeringPolicy>

minIndex:窗口索引最小值

maxIndex:窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为20。

fileNamePattern:必须包含“%i”例如,假设最小值和最大值分别为1和2,命名模式为 mylog%i.log,会产生归档文件mylog1.log和mylog2.log。还可以指定文件压缩选项,例如,mylog%i.log.gz 或者 没有log%i.log.zip

(4)SizeBasedTriggeringPolicy详解

SizeBasedTriggeringPolicy观察当前活动文件的大小,如果已经大于了指定的值,它会给 RollingFileAppender 发一个信号触发对当前活动文件的轮转。

属性
maxFileSize:可以为字节,千字节,兆字节,千兆字节,通过在数值后面指定一个后缀 KB,MB 或者 GB。例如,5000000,5000KB,5MB 以及 2GB 都是有效的,前三个是一样的。(默认值是 10 MB)

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>test.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
        <fileNamePattern>test.%i.log.zip</fileNamePattern>
        <minIndex>1</minIndex>
        <maxIndex>3</maxIndex>
    </rollingPolicy>

    <!--当文件大小超过5MB时,通知RollingPolicy轮转-->
    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
        <maxFileSize>5MB</maxFileSize>
    </triggeringPolicy>

    <encoder>
        <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n
        </pattern>
    </encoder>
</appender>

7、在appender中添加过滤器

Logback提供两类Filter,一类是Regular Filter;另外一类是Turbo Filter。

Regular Filter主要应用在appeder上,只在appender级别起作用,Appender实例上可以绑定一个Regular Filter实例链。Regular Filter继承实现”ch.qos.logback.core.filter.Filter”类,自定义自己的regular filter需要继承ch.qos.logback.core.filter.Filter类,并实现decide()方法。

TurboFilter对象绑定到日志记录上下文。因此,不仅在使用给定的appender时调用它们,而且每次都发出日志记录请求。它们的范围比附加到附加器的过滤器更宽。更重要的是,它们在LoggingEvent对象创建之前被调用 。 TurboFilter对象不需要实例化日志记录事件来过滤日志记录请求。因此,turbo过滤器旨在用于记录事件的高性能过滤,甚至在创建事件之前。要实现该类型的filter需要继承ch.qos.logback.classic.turbo.TurboFilter;

logback中一般有3种常见的过滤器:

LevelFilter
级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。
LevelFilter根据精确的级别匹配过滤事件。如果事件的级别等于配置的级别,则筛选器接受或拒绝该事件,具体取决于onMatch和onMismatch属性的配置。

EvaluatorFilter
求值过滤器,评估、鉴别日志是否符合指定条件。
EventEvaluator会评估给定事件是否满足给定条件。在匹配和不匹配时,托管EvaluatorFilter将分别返回onMatch或onMismatch属性指定的值。请注意,EventEvaluator是一个抽象类。您可以通过对EventEvaluator进行子类化来实现自己的事件评估逻辑。

ThresholdFilter
临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。
ThresholdFilter过滤低于指定阈值的事件。对于等于或高于阈值的事件,ThresholdFilter将在调用其decision()方法时响应NEUTRAL,但是将拒绝级别低于阈值的事件。

(1)LevelFilter

<!-- 配置控制台的appender 使用过滤器 -->
<appender name="consoleFilterAppender" class="ch.qos.logback.core.ConsoleAppender">
    <target>
        System.err
    </target>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <pattern>${pattern}</pattern>
    </encoder>
    <!-- 配置过滤器 -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <!-- 设置日志的输出级别 -->
        <level>ERROR</level>
        <!-- 高于level中设置的级别,则打印日志 -->
        <onMatch>ACCEPT</onMatch>
        <!-- 低于level中设置的级别,则屏蔽日志 -->
        <onMismatch>DENY</onMismatch>
    </filter>
</appender>
<root level="ALL">
    <!-- 引入appender,name属性 -->
    <appender-ref ref="consoleFilterAppender"/>
</root>

我们发现,控制台中只输出了ERROR级别的日志。

(2)EvaluatorFilter

属性

  • <evaluator>: 鉴别器,常用的鉴别器是JaninoEventEvaluato,也是默认的鉴别器,它以任意的java布尔值表达式作为求值条件,求值条件在配置文件解释过成功被动态编译,布尔值表达式返回true就表示符合过滤条件。evaluator有个子标签,用于配置求值条件。
  • <onMatch>:用于配置符合过滤条件的操作
  • <onMismatch>:用于配置不符合过滤条件的操作
//过滤掉所有日志消息中不包含“billing”字符串的日志
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">   
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">         
  <evaluator> <!-- 默认为 ch.qos.logback.classic.boolex.JaninoEventEvaluator -->   
	<expression>return message.contains("billing");</expression>   
  </evaluator>   
  <OnMatch>ACCEPT </OnMatch>  
  <OnMismatch>DENY</OnMismatch>  
</filter>   
<encoder>   
  <pattern>   
	%-4relative [%thread] %-5level %logger - %msg%n   
  </pattern>   
</encoder>   
</appender> 

(3)ThresholdFilter

ThresholdFilter是临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。

//过滤掉所有低于INFO级别的日志。
<appender name="CONSOLE"  class="ch.qos.logback.core.ConsoleAppender">   
<!-- 过滤掉 TRACE 和 DEBUG 级别的日志-->   
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">   
  <level>INFO</level>   
</filter>   
<encoder>   
  <pattern>   
	%-4relative [%thread] %-5level %logger{30} - %msg%n   
  </pattern>   
</encoder>   
</appender>

8、异步日志

我们之前用的同步日志只要是在记录日志,那么系统本身的功能就处于一种停滞的状态,当日志记录完毕后,才会执行其他的代码,如果日志记录量非常庞大的话,那么我们对于系统本身业务代码的执行效率会非常低。所以logback为我们提供了异步日志的功能。

<!-- 配置异步日志 -->
<appender name="asyncAppender" class="ch.qos.logback.classic.AsyncAppender">
    <appender-ref ref="consoleAppender"/>
</appender>

<root level="ALL">
    <!-- 引入appender -->
    <appender-ref ref="asyncAppender"/>
</root>

所谓异步日志的原理是:
系统会为日志操作单独的分配出来一根线程,原来用来执行当前方法的主线程会继续向下执行
线程1:系统业务代码执行
线程2:打印日志
两根线程争夺CPU的使用权

在实际项目开发中,越大的项目对于日志的记录就越庞大,为了保证项目的执行效率,异步日志是一个很好的选择。

补充:异步日志有可配置属性,配置了一个阈值,当队列的剩余容量小于这个阈值的时候,当前日志的级别 trace、debug、info这3个级别的日志将被丢弃,设置为0,说明永远都不会丢弃trace、debug、info这3个级别的日志。

<discardingThreshold>0</discardingThreshold>

配置队列的深度,这个值会影响记录日志的性能,默认值就是256。

<queueSize>256</queueSize>

关于这两个属性,一般情况下,我们使用默认值即可,不要乱配置,会影响系统性能,了解其功能即可。

9、自定义logger

<!--
    additivity="false"示不继承rootlogger
-->
<logger name="com.demo" level="info" additivity="false">
    <!-- 在自定义logger中配置appender -->
    <appender-ref ref="consoleAppender"/>
</logger>

logger是有父子关系的,子logger继承父logger的配置,我们这样配置表示com.demo包下所有的logger遵循这个配置,并且屏蔽掉了父logger。

10、配置文件转换器

不同的日志实现,配置文件也是不同的

例如:log4j经常使用的是properties属性文件;logback使用的是xml配置文件‘’

如果我们遇到了一种情况,就是需要将以前的log4j,改造为使用logback
我们可以访问logback官网,找到log4j.properties转换器,只要是二者兼容的技术,才会被翻译,如果是log4j独立的技术,logback没有,或者是有这个技术但是并不兼容转义,那么这个工具则不会为我们进行翻译,如果是遇到简单的配置,我们可以使用工具。

转换器地址:
https://logback.qos.ch/translator/

参考资料

http://www.51gjie.com/javaweb/1107.html

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐