(三)Logback中的Appender

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Logback会把书写日志事件的任务委托给叫做appender的组件,appenders必须实现ch.qos.logback.core.Appender接口,该接口方法如下:

一、什么是Appender?


Logback会把书写日志事件的任务委托给叫做appender的组件,appenders必须实现ch.qos.logback.core.Appender接口,该接口方法如下:

 

package ch.qos.logback.core;
import ch.qos.logback.core.spi.ContextAware;
import ch.qos.logback.core.spi.FilterAttachable;
import ch.qos.logback.core.spi.LifeCycle;
public interface Appender<E> extends LifeCycle, ContextAware, FilterAttachable {
  public String getName();
  public void setName(String name);
  void doAppend(E event);
}

Appender接口中的方法大多是getter或setter方法,而doAppend()方法例外,该方法携带E类型的实例作为唯一参数。E的实际类型取决于logback组件,在logback-classic里,E的类型为ILoggingEvent,而在logback-access组件里,E的类型为AccessEvent。doAppend()方法负责以合适的方式输出日志事件到输出设备。


Appender接口继承自FilterAttachable接口,因此可以绑定一个或多个filters。Appenders负责输出日志事件,但它可能会把实际日志格式化事件委托给Layout或者Encoder对象。而有些Appenders有内置或者固定的事件格式,因此不需要配置layout或者encoder。


Appender相关类图如下:



20190505103748103.png

二、Appender分类


1、ConsoleAppender

见名知意,日志信息输出到控制台,也就是通过System.out或者System.err输出,前者是默认值

WechatIMG115311.jpeg

示例:

<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
    </encoder>
  </appender>
  <root level="DEBUG">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

2、FileAppender

OutputStreamAppender的子类,输出日志信息到文件中,目标文件通过File选项指定。

WechatIMG115312.jpeg

示例:

<configuration>
  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>testFile.log</file>
    <append>true</append>
    <!-- set immediateFlush to false for much higher logging throughput -->
    <immediateFlush>true</immediateFlush>
    <!-- encoders are assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
  </appender>
  <root level="DEBUG">
    <appender-ref ref="FILE" />
  </root>
</configuration>


2.1 日志文件唯一命名(通过timestamp)

<configuration>
  <!-- Insert the current time formatted as "yyyyMMdd'T'HHmmss" under
       the key "bySecond" into the logger context. This value will be
       available to all subsequent configuration elements. -->
  <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss" timeReference="contextBirth"/>
  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <!-- use the previously created timestamp to create a uniquely
         named log file -->
    <file>log-${bySecond}.txt</file>
    <encoder>
      <pattern>%logger{35} - %msg%n</pattern>
    </encoder>
  </appender>
  <root level="DEBUG">
    <appender-ref ref="FILE" />
  </root>
</configuration>


3、RollingFileAppender


RollingFileAppender继承自FileAppender,用于翻滚日志文件。例如,写入日志信息到名为log.txt的文件,由于超出指定的文件大小限制,日志输出到另一个文件。


WechatIMG115331.jpeg

3.1 滚动策略

滚动策略负责日志文件移动和重命名相关滚动步骤,该接口api如下:

package ch.qos.logback.core.rolling;  
import ch.qos.logback.core.FileAppender;
import ch.qos.logback.core.spi.LifeCycle;
public interface RollingPolicy extends LifeCycle {
  public void rollover() throws RolloverFailure;
  public String getActiveFileName();
  public CompressionMode getCompressionMode();
  public void setParent(FileAppender appender);
}

基于时间的滚动策略是最长使用的滚动策略,可以通过天或者月份制定何时滚动。

属性名 类型 备注
fileNamePattern String 必选参数,定义了归档日志文件的名字,它的值由文件名和%d的占位转换符组成,如果没有指定时间和日期格式,默认为yyyy-MM-dd。

多个%d转换符

/var/log/%d{yyyy/MM, aux}/myapplication.%d{yyyy-MM-dd}.log

maxHistory int 可选参数,表示日志文件保存的最大数量。例如:如果按天滚动,该值设为30,则日志文件最多保存30天。
totalSizeCap int

可选参数,表示所有归档日志文件的的文件大小,和maxHistory结合使用,maxHistory优先于totalSizeCap。

cleanHistoryOnStart boolean

可选参数,表示appender启动时是否清除归档日志文件,默认为false。

下面是一些fileNamePattern的示例:

文件命名格式 滚动计划 备注
/wombat/foo.%d 按日滚动,由于%d后缺失日期和时期格式,采用默认格式yyyy-MM-dd

如果设置file属性(日志文件名),文件格式如下:

昨天:/wombat/foo.2019-05-05

当天:/wombat/foo.2019-05-06

如果设置file属性为/wombat/foo.txt,文件格式如下

昨天:/wombat/foo.2019-05-05

当天:/wombat/foo.txt

/wombat/%d{yyyy/MM}/foo.txt 按月滚动

如果没设置file属性,文件格式如下:

上个月:/wombat/2019/05/foo.txt

当月:/wombat/2019/06/foo.txt

如果设置file属性为/wombat/foo.txt,

上个月:/wombat/2019/05/foo.txt

当月:/wombat/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 指定时区按分钟滚动 文件命名规则与上类似,只是指定了时区
/foo/%d{yyyy-MM,aux}/%d.log 按天滚动,归档日志文件在一个包含年和月文件夹里。 第一个%d起辅助作用,第二个%d由于没有指定日期和时间格式,默认为yyyy-MM-dd。

TimeBasedRollingPolicy支持归档日志文件自动压缩,如果fileNamePattern的值以.gz或者.zip结尾则可利用该特性。

文件命名格式 滚动计划 备注
/wombat/foo.%d.gz 按日滚动,归档日志文件会自动GZIP压缩

如果file属性没有设置,文件格式如下:

昨天:/wombat/foo.2019-05-05.gz

当天:/wombat/foo.2019-05-06

如果设置file属性为/wombat/foo.txt,文件格式如下:

昨天:/wombat/foo.2019-05-05.gz

当天:/wombat/foo.txt

示例1 (滚动策略为TimeBasedRollingPolicy的RollingFileAppender):

<configuration>
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logFile.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- daily rollover -->
      <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
      <!-- keep 30 days' worth of history capped at 3GB total size -->
      <maxHistory>30</maxHistory>
      <totalSizeCap>3GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
  </appender> 
  <root level="DEBUG">
    <appender-ref ref="FILE" />
  </root>
</configuration>


示例2 (谨慎模式):

<configuration>
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!-- Support multiple-JVM writing to the same log file -->
    <prudent>true</prudent>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
      <maxHistory>30</maxHistory> 
      <totalSizeCap>3GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
  </appender> 
  <root level="DEBUG">
    <appender-ref ref="FILE" />
  </root>
</configuration>

3.1.2 Size and time based rolling policy(基于文件大小和时间的滚动策略)

通过这种策略可以按日期来归档日志文件,同时也可以限制每个日志文件的大小,示例如下:

<configuration>
  <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>mylog.txt</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <!-- rollover daily -->
      <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
       <!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
       <maxFileSize>100MB</maxFileSize>    
       <maxHistory>60</maxHistory>
       <totalSizeCap>20GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
      <pattern>%msg%n</pattern>
    </encoder>
  </appender>
  <root level="DEBUG">
    <appender-ref ref="ROLLING" />
  </root>
</configuration>

注意:%i转换符和%d在这里是必须的,当前时间周期内如果日志文件大小达到了maxFileSize,则会进行归档,文件名以从0开始的递增索引命名,%i表示从0开始递增索引。例如:mylog-2019-05-05.0.txt

3.1.3 FixedWindowRollingPolicy(固定窗口的滚动策略)

滚动时会根据固定窗口算法重命名文件,下面是FixedWindowRollingPolicy的可用属性:

属性名 类型 备注
minIndex int

最小索引

maxIndex int

最大索引

fileNamePattern String

文件命名格式,必须包含%i转换符,用来表示被插入的当前窗口索引的位置。例如:

如果文件命名格式为MyLogFile%i.log,minIndex、maxIndex分别被设为1、3,那么滚动时会产生名为MyLogFile1.log、MyLogFile2.log、MyLogFile3.log的三个日志文件。


假设minIndex被设为1,maxIndex被设为3,fileNamePatter被设为foo%i.log,file属性被设为foo.log,具体示例如下:

滚动次数 输出目标 归档日志文件 备注
0 foo.log - 没有产生滚动,日志输出文件为初始文件foo.log。
1 foo.log foo1.log 第一次滚动,foo.log重命名为foo1.log,新的foo.log被创建作为输出目标。
2 foo.log foo1.log, foo2.log 第二次滚动,foo1.log重命名为foo2.log,foo.log重命名为foo1.log,新的foo.log被创建作为输出目标。
3 foo.log foo1.log, foo2.log, foo3.log 第三次滚动,foo2.log重命名为foo3.log,foo1.log重命名为foo2.log,foo.log重命名为foo1.log,新的foo.log被创建作为输出目标。
4 foo.log foo1.log, foo2.log, foo3.log 后面滚动会先删除foo3.log,然后循环如上步骤。

配置如下:

<configuration>
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>test.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
      <fileNamePattern>tests.%i.log.zip</fileNamePattern>
      <minIndex>1</minIndex>
      <maxIndex>3</maxIndex>
    </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>
  <root level="DEBUG">
    <appender-ref ref="FILE" />
  </root>
</configuration>


三、TriggerPolicy(触发策略)


package ch.qos.logback.core.rolling;
import java.io.File;
import ch.qos.logback.core.spi.LifeCycle;
public interface TriggeringPolicy<E> extends LifeCycle {
  public boolean isTriggeringEvent(final File activeFile, final <E> event);
}

1、SizeBasedTriggeringPolicy


SizeBasedTriggeringPolicy会观察当前日志文件的大小,如果增长到指定值,会通知RollingFileAppender触发滚动。SizeBasedTriggeringPolicy只接受一个参数,也就是maxFileSize,默认值为10MB。maxFileSize选项的值可以是bytes、kilobytes、megabytes、gigabytes。例如:5000000、5000KB、5MB、2GB,前面三个等价。


下面是RollingFileAppender结合SizeBasedTriggeringPolicy配置示例:


<configuration>
  <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>
    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
      <maxFileSize>5MB</maxFileSize>
    </triggeringPolicy>
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
  </appender>
  <root level="DEBUG">
    <appender-ref ref="FILE" />
  </root>
</configuration>

结语:其它的appender还有SocketAppender、SSLSocketAppender、SMTPAppender等,具体参考:Chapter 4: Appenders

相关文章
|
Java
解决logback不能打印日志的问题
解决logback不能打印日志的问题
773 0
|
缓存 Java API
logback配置
一、logback介绍 logback分成三个模块:logback-core,logback- classic,logback-access。 logback-core:提供了logBack的核心功能,是另外两个组件的基础; logback-classic:实现了SLF4J API; logback
743 0
|
4月前
|
Java
使用SLF4J和Logback23
使用SLF4J和Logback23
38 3
|
8月前
|
监控 Java 测试技术
日志框架到底是Logback 还是 Log4j2
日志框架到底是Logback 还是 Log4j2
54 0
|
XML 安全 Java
logback的使用和配置|logback比log4j的优点|logback是一个更好的log4j
logback的使用和配置|logback比log4j的优点|logback是一个更好的log4j
|
算法 Java API
(三)Logback中的Appender
(三)Logback中的Appender
|
XML 安全 Oracle
logback的使用和logback.xml详解
logback的使用和logback.xml详解
453 0
|
监控 Java Shell
(二)Logback配置
Logback通过加载配置文件的方式来初始化配置,配置文件的加载顺序如下: 1)Logback首先会去类路径下找名为logback-test.xml的文件。 2)如果没有找到如上文件,会去类路径下找名为logback.groovy的文件。 3)如果没有找到如上文件,会去类路径下找名logback.xml的文件。
(二)Logback配置
|
Java jenkins Linux
Logback使用总结
整理了下logback的常用点功能,并记录了一些在使用过程中的疑问,和问题的排错过程,防止自己再犯类似错误,也希望对路过的你有所帮助。
709 0
|
SQL Java
日志 - Logback 详解
日志 - Logback 详解
187 0
日志 - Logback 详解

热门文章

最新文章