> 文档中心 > Appender的几种实现方式

Appender的几种实现方式

文章目录

    • 1. Appender接口
    • 2. Configuration根标签
    • 3. ConsoleAppender
    • 4. FileAppender
    • 5. RollingFileAppender
    • 6. AsyncAppender
    • 7. SiftingAppender

1. Appender接口

public interface Appender<E> extends LifeCycle, ContextAware, FilterAttachable<E> {    /**     * Get the name of this appender. The name uniquely identifies the appender.     * 获取Appender名称,该名称是Appender的唯一标识     */    String getName();    /**     * This is where an appender accomplishes its work. Note that the argument      * is of type Object.     * 执行Appender的工作, 实际就是对日志进行输出     *     * @param event     */    void doAppend(E event) throws LogbackException;    /**     * Set the name of this appender. The name is used by other components to     * identify this appender.     * 设置Appender名称,该名称将用于其他组件来识别该Appender     *      */    void setName(String name);}

同时,Appender接口还继承了LifeCycleContextAwareFilterAttachable接口,它们的作用如下:

  • LifeCycle:用于控制组件的生命周期
  • ContextAware:用于感知上下文实例,同时记录日志系统的状态信息
  • FilterAttachable:用于过滤器的添加、清空、获取、过滤结果的判决等操作

2. Configuration根标签

示例:

<configuration debug="true" scan="true" scanPeriod="60 seconds" packagingData="true">  </configuration>

属性说明:

  • debug:是否开启LoggerContext加载信息日志打印,默认false;
  • scan:是否开启Logback配置文件修改的周期性监听,默认false,当设置为true时必须设置有效的scanPeriod才能正常执行;
  • scanPeriod:监听周期,如:60 seconds表示每60秒检测一下;
  • packagingData:设置LoggerContext的packagingDataEnabled属性,用于控制打印异常堆栈时是否计算所在jar包以及它的版本,需要将jar包的package名添加到LoggerContext的frameworkPackages属性中,但计算开销比较大,所以默认false;

3. ConsoleAppender

类名:ch.qos.logback.core.ConsoleAppender

作用:控制台日志打印

可配置属性:

属性名 类型 作用
name java.lang.String 唯一名称
filter ch.qos.logback.core.filter.Filter 过滤器,用于控制日志是否输出
encoder ch.qos.logback.core.encoder.Encoder 编码器,用于控制日志输出格式
layout ch.qos.logback.core.Layout 日志排版格式,官方已不建议使用,使用encoder内部layout属性代替
immediateFlush boolean 输出流打印日志是否立即刷新,默认true
target java.lang.String 输入目标,仅支持System.outSystem.err, 默认值System.out
withJansi boolean 在Windows系统上是否支持以jansi输出,一个可以让控制台色彩缤纷的日志库,默认false

常见编码器:

  • LayoutWrappingEncoder:日志排版格式包装编码器,需要指定layout属性,同时提供charset属性指定;
  • PatternLayoutEncoder:LayoutWrappingEncoder的子类,默认采用PatternLayout,可仅需指定日志格式的pattern属性即可,若强行指定layout将抛出异常;

4. FileAppender

类名:ch.qos.logback.core.FileAppender

作用:文件日志打印

可配置属性:

属性名 类型 作用
name java.lang.String 唯一名称
filter ch.qos.logback.core.filter.Filter 过滤器,用于控制日志是否输出
encoder ch.qos.logback.core.encoder.Encoder 编码器,用于控制日志输出格式
layout ch.qos.logback.core.Layout 日志排版格式,官方已不建议使用,使用encoder内部layout属性代替
immediateFlush boolean 输出流打印日志是否立即刷新,默认true
file java.lang.String 输出文件
prudent boolean 当该属性设置为true时,表示来自多个jvm的日志可以安全地写入同一个文件中,同时append属性会被强制设置为true
append boolean 是否在配置的输出文件进行追加
bufferSize ch.qos.logback.core.util.FileSize 输出缓冲大小

5. RollingFileAppender

类名:ch.qos.logback.core.rolling.RollingFileAppender

作用:滚动文件日志打印,可根据一定规则进行切割打印

可配置属性:

属性名 类型 作用
name java.lang.String 唯一名称
filter ch.qos.logback.core.filter.Filter 过滤器,用于控制日志是否输出
encoder ch.qos.logback.core.encoder.Encoder 编码器,用于控制日志输出格式
layout ch.qos.logback.core.Layout 日志排版格式,官方已不建议使用,使用encoder内部layout属性代替
immediateFlush boolean 输出流打印日志是否立即刷新,默认true
file java.lang.String 输出文件, 当设置了触发策略或者滚动策略后就无需再设置该属性
prudent boolean 当该属性设置为true时,表示来自多个jvm的日志可以安全地写入同一个文件中,同时append属性会被强制设置为true
append boolean 在RollingFileAppender中,该属性强制为true
bufferSize ch.qos.logback.core.util.FileSize 输出缓冲大小
triggeringPolicy ch.qos.logback.core.rolling.TriggeringPolicy 触发策略,因某些策略同时实现了TriggeringPolicy和RollingPolicy接口,所以无需重复配置
rollingPolicy ch.qos.logback.core.rolling.RollingPolicy 滚动策略,因某些策略同时实现了TriggeringPolicy和RollingPolicy接口,所以无需重复配置

常见配置策略:

  • TimeBasedRollingPolicy:基于日期的滚动策略,可配置属性如下:

    属性名 类型 作用
    fileNamePattern java.lang.String 日志文件名称模板
    maxHistory int 历史日志文件最大保存时间(天)
    totalSizeCap ch.qos.logback.core.util.FileSize 所有日志文件最大保存大小
    timeBasedFileNamingAndTriggeringPolicy 太长,请查看源码 无需配置,因为其中一个实现方式被废弃,而另一个实现方式就是它的默认方式
  • SizeAndTimeBasedRollingPolicy:基于大小和日期的滚动策略,可配置属性如下:

    属性名 类型 作用
    fileNamePattern java.lang.String 日志文件名称模板
    maxHistory int 历史日志文件最大保存时间(天)
    totalSizeCap ch.qos.logback.core.util.FileSize 所有日志文件最大保存大小
    maxFileSize ch.qos.logback.core.util.FileSize 单个日志文件最大保存大小

6. AsyncAppender

类名:ch.qos.logback.classic.AsyncAppender

作用:异步打印日志;注意:AsyncAppender会在阈值触发时将TRACE、DEBUG、INFO级别的日志进行丢弃

可配置属性:

属性名 类型 作用
name java.lang.String 唯一名称
filter ch.qos.logback.core.filter.Filter 过滤器,用于控制日志是否输出
appender-ref 如: Appender引用
appender ch.qos.logback.core.Appender 异步执行的Appender,建议使用appender-ref代替
queueSize int 阻塞队列大小
discardingThreshold int 丢弃阈值,若阻塞队列剩余容量小于该阈值时进行丢弃判断,默认值为阻塞队列大小1/5
maxFlushTime int Appender停止时允许异步线程延迟销毁时间(毫秒)
neverBlock boolean 是否从不阻塞
includeCallerData boolean 是否包含调用者数据

7. SiftingAppender

类名:ch.qos.logback.classic.sift.SiftingAppender

作用:根据指定的变量使用对应的Appender, 可以实现特定日志写入特定文件中

可配置属性:

  1. discriminator

    <discriminator>        <key>thread</key>        <defaultValue>unknown</defaultValue></discriminator>
  2. sift

    <sift>        <appender name="${thread}_file" class="ch.qos.logback.core.FileAppender"> <file>./logs/${thread}-file.log</file> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">     <pattern>%d{yyyy-MM-dd HH:mm:ss SSS} [%level] [%thread] %logger{100}:%line - %msg%n</pattern>     <charset>UTF-8</charset> </encoder>    </appender></sift>

书法艺术字体