Java 默认log4j策略

Java 默认log4j策略,java,spring,logging,log4j,slf4j,Java,Spring,Logging,Log4j,Slf4j,我试图理解TimeBasedTriggeringPolicy如何确定何时创建/追加/删除日志文件 对于以下配置: <RollingRandomAccessFile name="test" fileName="/logs/test.log" filePattern="/logs/test.log.%d{yyyy-MM-dd}" <Policies> <TimeBasedTriggeringPolicy />

我试图理解
TimeBasedTriggeringPolicy
如何确定何时创建/追加/删除日志文件

对于以下配置:

<RollingRandomAccessFile name="test" fileName="/logs/test.log" filePattern="/logs/test.log.%d{yyyy-MM-dd}"
<Policies>
 <TimeBasedTriggeringPolicy />
</Policies>
</RollingRandomAccessFile>
?

我试图理解基于时间的触发策略是如何决定何时启动的 创建/附加/删除日志文件

TimeBasedTriggeringPolicy
控制下一次滚动发生的时间。下一次滚动时间根据提供的日期单位确定<代码>{yyyy-MM-dd}表示是第二天。在没有其他触发策略的情况下,所有日志都会附加到当前文件中

DefaultRolloverStrategy
控制何时根据文件模式归档/删除/创建日志文件。当第二天到来时,将创建具有当前日期的新文件,并将所有日志附加到新文件中。根据滚动策略配置,可以保留或删除前一天的文件
max
min
属性控制文件模式中带有
%i
说明符的文件数量,以维护文件计数器,并控制文件重命名

原创

%d参数表示新的日志文件test.log附加了 是否每天都创建当前{yyyy-MM-dd}?以前版本的 是否未删除test.log?如果我将%d更改为%M,是否应创建新文件 每个月创建一次

%d
是转换说明符-Log4j 2具有用于不同转换说明符的转换器<代码>%d指日期,允许您发送日期格式。日期时间单位本身控制何时发生滚动<代码>%m在log4j2中不可识别,您将使用
%d{yyyy-MM}
每月创建一个文件。您可以使用
modulate
标志在间隔边界-月初滚动文件

为了确保仅当前日志文件可用且 如果策略修改为:

<RollingRandomAccessFile name="test" fileName="/logs/test.log" filePattern="/logs/test.log.%d{yyyy-MM-dd}"
<Policies>
 <TimeBasedTriggeringPolicy interval="1"/>
</Policies>
</RollingRandomAccessFile>
/RollingHandomAccessFile>

是的,没错
interval=“1”
是默认值,因此可以删除<代码>默认滚动策略在未指定任何滚动策略时应用。默认的滚动策略将使用提供的文件名模式进行滚动。由于这是每天的(
-dd
),它将每天滚动文件,而在同一天没有中间文件

从-

RollingLandMacAccessFileAppender需要触发策略和 滚动策略。触发策略确定是否发生滚动 应在RolloverStrategy定义 应该进行滚动。如果未配置RolloverStrategy, RollingLandMacAccessFileAppender将使用默认RollorOverstrategy


您可以使用适当的触发策略和滚动策略进行进一步自定义。

除其他外,在配置时,您需要为
文件模式
参数提供一个值

此配置参数将指示生成的归档日志文件的文件名模式

此模式的格式取决于
RollingFileAppender
使用的
RolloverPolicy

默认情况下,Log4j 2将使用

此策略将允许您通过指示
%i
模式标记,或通过日期/时间,以及在您的用例中指示
%d
模式标记,基于数字索引滚动日志。您还可以将数字索引添加到日期/时间模式中:在这种情况下,数字索引将递增,直到日期/时间模式的结果发生更改

如果定义了日期/时间模式,则需要通过在示例中传递兼容模式
yyyy-MM-dd
来提供执行滚动的基本粒度

我说的是基本粒度,而不仅仅是粒度,因为实际的日志滚动时刻将取决于如何配置与
RollingFileAppender
关联的触发器策略

在的情况下,您可以配置几个参数来确定日志滚动行为,主要有两个

首先,您有
interval
参数:它将根据日期模式中最具体的时间单位指示滚动发生的频率。i、 e.如您的示例所示,如果您将天配置为最具体的单位,并为
间隔
参数提供
3
(默认为
1
)的值,则滚动将每隔
3
天发生一次

其次,您可以激活
modulate
参数(默认为
false
)。此参数指示是否应调整间隔以使下一次滚动发生在间隔边界上。Log4j2文档提供了一个清晰的示例:

例如,如果项目为小时,当前小时为凌晨3点,间隔为4点,则第一次滚动将在凌晨4点发生,然后下一次滚动将在上午8点、中午、下午4点等发生

在您的用例中也会出现类似的情况,但语义为“一年中的某一天”

有关详细信息,请参见
PatternProcessor
类的。同时也要注意这个问题

关于日志删除,据我所知,如果您在模式中使用数字索引(通过调整
fileIndex
min
end
max
参数),默认的滚动策略只会删除旧文件,但是,由于Log4j 2.5,当日志滚动发生时,可以使用来执行基于日期/时间的日志的清理(在Log4j中,将in-actions视为一种钩子)

例如,如果您只需要将日志文件保留30天,则可以使用以下内容配置此功能:


请务必注意,删除过程可能会影响任何文件,而不仅仅是日志文件:请确保