SpringBoot整合Logback

℡╲_俬逩灬. 提交于 2019-12-02 19:57:37

本文主要讲与Boot整合,后面会详细讲解Logback

官方文档

ConsoleAppender

如 name 所示,附加在 console 上,或者更准确地说是 System.out 或 System.err,前者是默认目标。 ConsoleAppender格式 events 借助用户指定的编码器。编码器将在后续章节中讨论。 System.out 和 System.err 都是java.io.PrintStream类型。因此,它们被包装在OutputStreamWriter内部,缓冲 I/O 操作。

   
Property Name 类型 描述
编码器 编码器 请参见OutputStreamAppender properties。
目标 String 其中一个 String 值 System.out 或 System.err。默认目标是 System.out。
withJansi boolean 默认情况下,将 jansi property 设置为false。将 withJansi 设置为true会激活Jansi library,它为 Windows 机器上的 ANSI 颜色代码提供支持。在 Windows host 上,如果此 property 设置为 true,那么您应该在 class 路径上放置“org.fusesource.jansi:jansi:1.9”。请注意,默认情况下,Unix-based 操作系统(如 Linux 和 Mac OS X)支持 ANSI 颜色代码。 在 Eclipse IDE 下,您可能想尝试ANSI 中的 Eclipse Console插件。

这是一个使用ConsoleAppender的 sample configuration。

Example:ConsoleAppender configuration(logback-examples/src/main/resources/chapters/appenders/conf/logback-Console.xml) 查看为.groovy

<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>

 

将当前路径设置为 logback-examples 目录和设置 class 路径后,可以通过发出以下命令为上述 configuration 文件添加一个旋转:

java chapters.appenders.ConfigurationTester src/main/java/chapters/appenders/conf/logback-Console.xml

FileAppender

FileAppenderOutputStreamAppender的子类,将 log events 附加到文件中。目标文件由“文件”选项指定。如果该文件已存在,则根据追加 property 的 value 将其追加或截断。

   
Property Name 类型 描述
附加 boolean 如果 true,events 附加在现有文件的末尾。否则,如果 append 为 false,则会截断任何现有文件。默认情况下,append 选项设置为 true。
编码器 编码器 请参见OutputStreamAppender properties。
文件 String 要写入的文件的 name。如果该文件不存在,则创建该文件。在 MS Windows 平台上,用户经常忘记逃避反斜杠。对于 example,value c:\ temp\test.log 不太可能被正确解释,因为' t'是一个被解释为单个制表符( u0009)的转义序列。正确的值可以指定为 c:/temp/test.log,也可以指定为 c:\ temp \ test.log。 “文件”选项没有默认的 value。 如果文件的 parent 目录不存在,FileAppender将自动创建它,包括任何必要但不存在的 parent 目录。
谨慎 boolean 在谨慎模式下,FileAppender将安全地写入指定的文件,即使存在其他FileAppender实例 running 在不同的 JVM 中,也可能在不同的主机上运行。谨慎模式的默认 value 是false。 谨慎模式可以与RollingFileAppender一起使用,尽管有些限制适用。 谨慎模式意味着追加 property 会自动设置为 true。 谨慎更依赖于独占文件锁。实验表明,文件锁定大约是写入 logging event 成本的三倍(x3)。在写入位于本地硬盘上的文件的“普通”PC 上,当谨慎模式关闭时,写一个 logging event 大约需要 10 微秒。当谨慎模式打开时,输出单个 logging event 大约需要 30 微秒。这意味着当谨慎模式关闭时,logging 吞吐量为每秒 100'000 次事件,而谨慎模式下每秒约为 33'000 次事件。 谨慎模式有效地序列化写入同一文件的所有 JVM 之间的 I/O 操作。因此,随着竞争访问文件的 JVM 数量的增加,每个 I/O 操作所引起的延迟也会增加。由于操作的总数在每秒 20 个 log 请求的 order 中,因此对 performance 的影响应该可以忽略不计。 每秒生成 100 次或更多 I/O 次操作的应用程序可以看到对 performance 的影响,应避免使用谨慎模式。 网络文件锁当 log 文件位于网络文件系统上时,审慎模式的成本会更高。同样重要的是,网络文件系统上的文件锁定有时会产生强烈的偏差,以至于 process 当前拥有锁定时会立即锁定锁定。因此,当一个 process 占用 log 文件的锁时,其他进程也会等待锁定到出现死锁状态。 谨慎模式的影响在很大程度上取决于网络速度以及 OS implementation 细节。我们提供了一个名为FileLockSimulator的非常小的 application,它可以帮助您模拟环境中谨慎模式的行为。

立即刷新默认情况下,每个 log event 立即刷新到基础输出流。这种默认方法更安全,因为如果你的 application 退出而没有正确关闭 appenders,logging events 就不会丢失。但是,为了显着增加 logging 吞吐量,您可能希望将 immediateFlush property 设置为false

下面是FileAppender的 configuration 文件的示例:

Example:FileAppender configuration(logback-examples/src/main/resources/chapters/appenders/conf/logback-fileAppender.xml) 查看为.groovy

<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>

 

将当前目录更改为 logback-examples 后,通过启动以下命令运行此 example:

java chapters.appenders.ConfigurationTester src/main/java/chapters/appenders/conf/logback-fileAppender.xml

唯一命名的 files(按时间戳)

在 application 开发阶段或 short-lived applications 的情况下,e.g. batch applications,最好在每次新的 application 启动时创建一个新的 log 文件。借助``元素,这很容易做到。这是一个 example。

Example:按时间戳(logback-examples/src/main/resources/chapters/appenders/conf/logback-timestamp.xml)唯一命名的 FileAppender configuration 查看为.groovy

<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"/>
​
  <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>

 

timestamp 元素采用两个必需属性 key 和 datePattern 以及一个可选的 timeReference 属性。 key 属性是 key 的 name,时间戳可用于后续 configuration 元素作为变量。 datePattern 属性表示 date pattern,用于将当前 time(解析 configuration 文件)转换为 string。 date pattern 应遵循SimpleDateFormat中定义的约定。 timeReference 属性表示 time 戳记的 time reference。默认值为 configuration 文件的 interpretation/parsing time,i.e。当前 time。但是,在某些情况下,使用 context birth time 作为 time reference 可能很有用。这可以通过将 timeReference 属性设置为"contextBirth"来完成。

通过 running 命令试验``元素:

java chapters.appenders.ConfigurationTester src/main/resources/chapters/appenders/conf/logback-timestamp.xml

要将 logger context birth date 用作 time reference,可以将 timeReference 属性设置为“contextBirth”,如下所示。

Example:使用 context birth date 作为 time reference(logback-examples/src/main/resources/chapters/appenders/conf/logback-timestamp-contextBirth.xml)的时间戳 查看为.groovy

<configuration>
  <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss" 
             timeReference="contextBirth"/>
  ...
</configuration>

 

RollingFileAppender 进行

RollingFileAppender 进行扩展FileAppender,具有翻转 log files 的功能。对于 example,RollingFileAppender可以 log 到名为 log.txt file 的文件,并且一旦满足某个条件,就将其 logging 目标更改为另一个文件。

有两个重要的 sub-components 与RollingFileAppender相互作用。第一个RollingFileAppender sub-component,即RollingPolicy,(见下文)负责进行翻转所需的行动。 RollingFileAppender的第二个 sub-component,即TriggeringPolicy,(见下文)将确定是否以及何时发生翻转。因此,RollingPolicy负责什么和TriggeringPolicy负责何时。

为了任何用途,RollingFileAppender必须同时设置RollingPolicyTriggeringPolicy。但是,如果也实现了TriggeringPolicy接口,那么只需要明确指定前者。

以下是RollingFileAppender的可用 properties:

   
Property Name 类型 描述
文件 String 请参见FileAppender properties。
附加 boolean 请参见FileAppender properties。
编码器 编码器 请参见OutputStreamAppender properties。
rollingPolicy RollingPolicy 此选项是 component,它将在发生翻转时指示RollingFileAppender的行为。查看以下更多信息。
triggeringPolicy TriggeringPolicy 此选项是 component,它将告诉RollingFileAppender何时激活翻转过程。查看以下更多信息。
谨慎 boolean 谨慎模式不支持FixedWindowRollingPolicyRollingFileAppenderTimeBasedRollingPolicy一起支持谨慎模式,尽管有两个限制。 在谨慎模式下,不支持也不允许文件压缩。 (我们不能将一个 JVM 写入文件而另一个 JVM 正在压缩 it.) FileAppender的文件 property 无法设置并且必须留空。实际上,大多数操作系统不允许重命名文件而另一个 process 有它打开. 另见 properties for FileAppender

滚动 policies 概述

RollingPolicy负责涉及文件移动和重命名的翻转程序。

RollingPolicy界面如下所示:

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);
}

 

rollover方法完成了归档当前 log 文件所涉及的工作。调用getActiveFileName()方法来计算当前 log 文件的文件 name(写入实时日志的位置)。如getCompressionMode方法所示,RollingPolicy 还负责确定压缩模式。最后,RollingPolicy通过setParent方法给它的 parent 一个 reference。

TimeBasedRollingPolicy

TimeBasedRollingPolicy可能是最受欢迎的滚动政策。它定义基于 time 的翻转 policy,用于 example 按天或按月。 TimeBasedRollingPolicy承担翻滚责任以及触发所述翻转的责任。实际上,TimeBasedTriggeringPolicy实现了RollingPolicyTriggeringPolicy接口。

TimeBasedRollingPolicy的 configuration 需要一个必需的 fileNamePattern property 和几个可选的 properties。

   
Property Name 类型 描述
fileNamePattern String 必需的 fileNamePattern property 定义 rolled-over(已存档)log files 的 name。它的 value 应该包含文件的 name,以及一个适当放置的%d 转换说明符。 %d 转换说明符可能包含java.text.SimpleDateFormat class 指定的 date-and-time pattern。如果省略 date-and-time pattern,则假定使用默认的 pattern yyyy-MM-dd。 翻转期间是从 fileNamePattern 的 value 推断的. 请注意,RollingFileAppender中的文件 property(TimeBasedRollingPolicy的 parent)可以设置或省略。通过设置包含FileAppender的文件 property,您可以分离 active log 文件的位置和已归档的 log files 的位置。当前日志将始终以文件 property 指定的文件为目标。因此,当前 active log 文件的 name 不会在 time 时间内发生变化。但是,如果选择省略文件 property,则将根据 fileNamePattern 的 value 为每个句点重新计算 active 文件。以下示例应澄清这一点。 在%d {}的荣誉中找到的 date-and-time pattern 遵循 java.text.SimpleDateFormat 惯例。 fileNamePattern property 或 date-and-time pattern 中任何位置的正斜杠'/'或反斜杠''字符都将被解释为目录分隔符。 多个%d 说明符 可以指定多个%d 说明符,但只能有一个可以是主要的 i.e。用于推断翻转期。必须通过传递'aux'参数将所有其他令牌标记为辅助(参见下面的示例)。 多个%d 说明符允许您在不同于 roll-over 期间的文件夹结构中组织存档文件。例如,下面显示的文件 name pattern 按年和月组织 log 文件夹,但每天午夜组织 roll-over log files。 /var/log/%d{yyyy/MM, aux}/myapplication.%d{yyyy-MM-dd}.log ** TimeZone ** 在某些情况下,您可能希望根据 timezone 中与 host 不同的时钟 yyyy-MM-dd log files。可以在%d 转换说明符中的 date-and-time pattern 之后传递 timezone 参数。对于 example: aFolder/test.%d{yyyy-MM-dd-HH, UTC}.log 如果指定的 timezone 标识符未知或拼写错误,则假定 GMT timezone 由TimeZone.getTimeZone(String)方法规范指定。
maxHistory INT 可选的 maxHistory property 控制要保留的最大归档 files 数,异步删除旧的 files。例如,如果您指定每月翻转,并将 maxHistory 设置为 6,则将保留 6 个月的档案 files,并删除超过 6 个月的 files。请注意,删除旧的归档 log files 后,将删除为 log 文件归档而创建的任何文件夹。
totalSizeCap INT 可选的 totalSizeCap property 控制所有 archive files 的总大小。超过总大小上限时,将异步删除最旧的归档。 totalSizeCap property 也需要设置 maxHistory property。此外,始终首先应用“最大历史记录”限制,然后应用“总大小上限”限制。
cleanHistoryOnStart boolean 如果设置为 true,将在 appender 启动时执行归档删除。默认情况下,此 property 设置为 false。 归档删除通常在翻转期间执行。但是,某些应用程序可能无法存活 long 足以触发翻转。因此,对于这样的 short-lived applications,存档移除可能永远不会有机会执行。通过将 cleanHistoryOnStart 设置为 true,可以在 appender 启动时执行存档删除。

这里有几个fileNamePattern值,并解释了它们的效果。

   
fileNamePattern 滚动时间表
/wombat/foo。%d 每日翻转(午夜)。由于省略了%d 标记说明符的可选 time 和 date pattern,因此假定 yyyy-MM-dd 的默认 pattern,它对应于每日翻转。 file property 未设置:在 2006 年 11 月 23 日期间,logging 输出将转到文件/wombat/foo.2006-11-23。在午夜和 24 日的 rest,logging 输出将被定向到/wombat/foo.2006-11-24。 file property 设置为/wombat/foo.txt:在 2006 年 11 月 23 日期间,logging 输出将转到文件/wombat/foo.txt。在午夜,foo.txt 将重命名为/wombat/foo.2006-11-23。将创建一个新的/wombat/foo.txt 文件,对于 11 月 24 日的 rest,logging 输出将被定向到 foo.txt。
/wombat/%d {yyyy/MM} /foo.txt 每个月初的滚动。 file property 未设置:在 2006 年 10 月期间,logging 输出将转到/wombat/2006/10/foo.txt。在 10 月 31 日午夜和 11 月 rest 之后,logging 输出将被定向到/wombat/2006/11/foo.txt。 file property 设置为/wombat/foo.txt:active log 文件将始终为/wombat/foo.txt。在 2006 年 10 月期间,logging 输出将达到/wombat/foo.txt。 10 月 31 日午夜,/wombat/foo.txt 将重命名为/wombat/2006/10/foo.txt。将创建一个新的/wombat/foo.txt 文件,其中 logging 输出将用于 11 月的 rest。 11 月 30 日午夜,/wombat/foo.txt 将重命名为/wombat/2006/11/foo.txt,依此类推。
/wombat/foo。%d {。 221} .log 每周第一天的滚动。请注意,一周的第一天取决于 locale。 与之前的情况类似,除了翻转将在每个新周的开始时发生。
/wombat/foo%d {。 222} .log 在每小时的顶部翻滚。 与之前的情况类似,除了翻转将发生在每小时的顶部。
/wombat/foo%d {。 223} .log 每分钟开始时的滚动。 与之前的情况类似,除了翻转将在每分钟开始时发生。
/wombat/foo%d {yyyy-MM-dd_HH-mm,UTC} .log 每分钟开始时的滚动。 与之前的情况类似,但文件名将以 UTC 表示。
/foo/%d {yyyy-MM,aux} /%d.log 每日滚动。存档位于包含年份和月份的文件夹下。 在此 example 中,第一个%d 标记被标记为aux iliary。然后假定第二个%d 标记(省略 time 和 date pattern)为主要标记。因此,每天都会发生翻转(默认为%d),文件夹 name 将取决于年份和月份。例如,在 2006 年 11 月期间,存档的 files 将全部放在/foo/2006-11/文件夹下,e.g /foo/2006-11/2006-11-14.log。

任何正斜杠或反斜杠字符都被解释为文件夹(目录)分隔符。将根据需要创建任何所需的文件夹。因此,您可以轻松地将 log files 放在单独的文件夹中。

TimeBasedRollingPolicy支持自动文件压缩。如果 fileNamePattern 选项的 value _end 为.gz 或.zip,则启用此 feature。

   
fileNamePattern 滚动时间表
/wombat/foo。%d.gz 每日翻转(午夜),对存档的 files 进行自动 GZIP 压缩。 file property 未设置:在 2009 年 11 月 23 日期间,logging 输出将转到文件/wombat/foo.2009-11-23。但是,在午夜,该文件将被压缩为/wombat/foo.2009-11-23.gz。对于 11 月 24 日,logging 输出将被定向到/wombat/folder/foo.2009-11-24,直到它在第二天开始时翻转。 file property 设置为/wombat/foo.txt:在 2009 年 11 月 23 日期间,logging 输出将转到/wombat/foo.txt 文件。在午夜,该文件将被压缩并重命名为/wombat/foo.2009-11-23.gz。将创建一个新的/wombat/foo.txt 文件,其中 logging 输出将发送到 11 月 24 日的 rest。 11 月 24 日午夜,/wombat/foo.txt 将被压缩并重命名为/wombat/foo.2009-11-24.gz,依此类推。

fileNamePattern 具有双重用途。首先,通过研究 pattern,logback 计算请求的翻转周期。其次,它计算每个归档文件的 name。请注意,两种不同的模式可以指定相同的周期。模式 yyyy-MM 和 yyyy@MM 都指定每月翻转,但生成的存档 files 将带有不同的名称。

通过设置文件 property,您可以分离 active log 文件的位置和已归档的 log files 的位置。 logging 输出将定位到文件 property 指定的文件中。因此,active log 文件的 name 不会在 time 时间内发生变化。但是,如果选择省略文件 property,则将根据 fileNamePattern 的 value 为每个句点重新计算 active 文件。通过保留文件选项未设置,可以避免在翻转期间存在引用 log files 的外部文件句柄时发生的文件重命名错误

maxHistory property 控制要保留的最大归档文件数,删除旧的 files。例如,如果您指定每月翻转,并将 maxHistory 设置为 6,则将保留 6 个月的档案 files,并删除超过 6 个月的 files。请注意,删除旧的归档 log files 后,将删除为 log 文件归档而创建的任何文件夹。

由于各种技术原因,翻转不是 clock-driven,而是取决于 logging events 的到来。例如,在 2002 年 3 月 8 日,假设 fileNamePattern 设置为 yyyy-MM-dd(每日翻转),则午夜之后第一个 event 的到达将触发翻转。如果在午夜之后的 23 分 47 秒没有 logging events,那么翻转实际上将发生在 3 月 9 日 00:2347 AM 而不是 0:00 AM。因此,根据 events 的到达率,可能会以一些延迟触发翻转。但是,无论延迟如何,已知翻转算法是正确的,因为在某个时间段内生成的所有 logging events 将在限定该时间段的正确文件中输出。

这是RollingFileAppender的 sample configuration 与TimeBasedRollingPolicy一起使用。

示例:使用TimeBasedRollingPolicy(logback-examples/src/main/resources/chapters/appenders/conf/logback-RollingTimeBased.xml)Sample 配置RollingFileAppender 查看为.groovy

<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>

 

下一个 configuration sample 说明了在谨慎模式下使用与TimeBasedRollingPolicy相关联的RollingFileAppender

示例:使用TimeBasedRollingPolicy(logback-examples/src/main/resources/chapters/appenders/conf/logback-PrudentTimeBasedRolling.xml)Sample 配置RollingFileAppender 查看为.groovy

<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>

 

基于大小和 time 的滚动 policy

有时您可能希望基本上通过 date 归档 files 但是在 time 限制每个 log 文件的大小,特别是如果 post-processing 工具对 log files 施加大小限制。为了满足此要求,logback 附带了SizeAndTimeBasedRollingPolicy

请注意,TimeBasedRollingPolicy已经允许限制存档的 log files 的组合大小。如果您只想限制 log 档案的组合大小,那么上面描述的TimeBasedRollingPolicy和设置totalSizeCap property 应该足够了。

这是一个 sample configuration 文件,演示了基于 time 和 size 的 log 文件归档。

例如:SizeAndTimeBasedFNATP(logback-examples/src/main/resources/chapters/appenders/conf/logback-sizeAndTime.xml)的 Sample configuration 查看为.groovy

<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>

 

请注意除“%d”之外的“%i”转换标记。 %i 和%d 标记都是必需的.当前 log 文件在当前 time 周期_end 之前达到 maxFileSize 的每个 time,它将以增加的索引存档,从 0 开始。

基于大小和 time 的归档支持删除旧的归档 files。您需要使用 maxHistory property 指定要保留的句点数。当您的 application 停止并重新启动时,logging 将_在正确的位置 i.e。在当前时期的最大指数。

在 1.1.7 之前的版本中,本文档提到了一个名为SizeAndTimeBasedFNATP的 component。但是,鉴于SizeAndTimeBasedFNATP提供了更简单的 configuration 结构,我们不再记录SizeAndTimeBasedFNATP。尽管如此,使用SizeAndTimeBasedFNATP的早期 configuration files 将会继续正常工作。事实上,SizeAndTimeBasedRollingPolicy是用SizeAndTimeBasedFNATP子组件实现的。

FixedWindowRollingPolicy

翻新时,FixedWindowRollingPolicy根据固定窗口算法重命名 files,如下所述。

fileNamePattern 选项表示已归档(已翻转)log files 的文件 name pattern。此选项是必需的,并且必须在 pattern 中的某处包含 integer 标记%i。

以下是FixedWindowRollingPolicy的可用 properties

   
Property Name 类型 描述
minIndex int 此选项表示窗口索引的下限。
maxIndex int 此选项表示窗口索引的上限。
fileNamePattern String 此选项表示_pat 在重命名 log files 时将遵循的 pattern。它必须包含 string%i,它将指示将插入当前窗口索引的 value 的位置。 对于 example,使用与最小值和最大值 1 和 3 关联的 MyLogFile%i.log 将生成名为 MyLogFile1.log,MyLogFile2.log 和 MyLogFile3.log 的归档文件。 请注意,文件压缩也是通过此 property 指定的。对于 example,fileNamePattern 设置为 MyLogFile%i.log.zip 表示必须使用 zip 格式压缩已归档的 files; gz 格式也受支持。

鉴于固定窗口滚动 policy 需要与窗口大小一样多的文件重命名操作,因此强烈建议不要使用大窗口大小。当用户指定较大的值时,当前 implementation 将自动将窗口大小减小到 20。

让我们回顾一下固定窗口翻转 policy 的更具体的例子。假设 minIndex 设置为 1,maxIndex 设置为 3,fileNamePattern property 设置为 foo%i.log,文件 property 设置为 foo.log。

    
翻车数量 Active 输出目标 存档的 log files 描述
0 foo.log - 还没有发生翻转,退回登录到初始文件。
1 foo.log foo1.log 第一次翻转。 foo.log 重命名为 foo1.log。创建一个新的 foo.log 文件并成为 active 输出目标。
2 foo.log foo1.log,foo2.log 第二次翻转。 foo1.log 重命名为 foo2.log。 foo.log 重命名为 foo1.log。创建一个新的 foo.log 文件并成为 active 输出目标。
3 foo.log foo1.log,foo2.log,foo3.log 第三次翻转。 foo2.log 重命名为 foo3.log。 foo1.log 重命名为 foo2.log。 foo.log 被重命名为 foo1.log。创建一个新的 foo.log 文件并成为 active 输出目标。
4 foo.log foo1.log,foo2.log,foo3.log 在此轮次和后续轮次中,翻转开始时删除 foo3.log。通过递增索引来重命名其他 files,如前面的步骤所示。在此后续翻转中,将有三个存档日志和一个 active log 文件。

下面的 configuration 文件给出了配置RollingFileAppenderFixedWindowRollingPolicy的示例。请注意,即使文件选项包含与使用 fileNamePattern 选项传送的相同信息,也必须使用“文件”选项。

示例:使用FixedWindowRollingPolicy(logback-examples/src/main/resources/chapters/appenders/conf/logback-RollingFixedWindow.xml)Sample 配置RollingFileAppender 查看为.groovy

<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>

 

代码示例

logback-spring.xml

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
​
     <appender name="consoleApp" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>
                %date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
            </pattern>
        </layout>
    </appender>
​
    <appender name="fileInfoApp" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>ERROR</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>
                %date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
            </pattern>
        </encoder>
        <!-- 滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 路径 -->
            <fileNamePattern>app_log/log/app.info.%d.log</fileNamePattern>
        </rollingPolicy>
    </appender>
​
    <appender name="fileErrorApp" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>
                %date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
            </pattern>
        </encoder>
        
        <!-- 设置滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 路径 -->
            <fileNamePattern>app_log/log/app.err.%d.log</fileNamePattern>
            
            <!-- 控制保留的归档文件的最大数量,超出数量就删除旧文件,假设设置每个月滚动,
            且<maxHistory> 是1,则只保存最近1个月的文件,删除之前的旧文件 -->
             <MaxHistory>1</MaxHistory>
            
        </rollingPolicy>
    </appender>
   <root level="INFO">  
        <appender-ref ref="consoleApp"/>
        <appender-ref ref="fileInfoApp"/>
        <appender-ref ref="fileErrorApp"/>
    </root>
</configuration>

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!