本文主要讲与Boot整合,后面会详细讲解Logback
官方文档
ConsoleAppender
如 name 所示,附加在 console 上,或者更准确地说是 System.out 或 System.err,前者是默认目标。 ConsoleAppender
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
FileAppender是OutputStreamAppender
的子类,将 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
必须同时设置RollingPolicy
和TriggeringPolicy
。但是,如果也实现了TriggeringPolicy
接口,那么只需要明确指定前者。
以下是RollingFileAppender
的可用 properties:
Property Name | 类型 | 描述 |
文件 | String |
请参见FileAppender properties。 |
附加 | boolean |
请参见FileAppender properties。 |
编码器 | 编码器 | 请参见OutputStreamAppender properties。 |
rollingPolicy | RollingPolicy |
此选项是 component,它将在发生翻转时指示RollingFileAppender 的行为。查看以下更多信息。 |
triggeringPolicy | TriggeringPolicy |
此选项是 component,它将告诉RollingFileAppender 何时激活翻转过程。查看以下更多信息。 |
谨慎 | boolean |
谨慎模式不支持FixedWindowRollingPolicy。 RollingFileAppender 与TimeBasedRollingPolicy一起支持谨慎模式,尽管有两个限制。 在谨慎模式下,不支持也不允许文件压缩。 (我们不能将一个 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
实现了RollingPolicy
和TriggeringPolicy
接口。
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 文件给出了配置RollingFileAppender
和FixedWindowRollingPolicy
的示例。请注意,即使文件选项包含与使用 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>