查找和模式之间的区别



在 Log4j2 中关于RollingFileAppender的一个问题中,我找到了以下代码段<Property name="FilePattern">C:/logs/$${date:yyyy-MM}/app-%d{MM- dd-yyyy}-%i.log.gz</Property>

我想知道在上半部分使用查找$${data:yyyy-MM}并在后半部分使用模式%d{yyyy-MM-dd}的原因是什么。例如使用C:/logs/%d{yyyy-MM}/app-%d{...}-%i.log.gz会有什么效果?

根据我在文档中读到的内容,查找支持许多 - 更复杂的 - 类型的属性查找,但是在上述情况下有什么好处,特别是考虑到文档明确指出filePattern属性支持日期查找(The pattern also supports interpolation at runtime so any of the Lookups (such as the DateLookup) can be included in the pattern.(,但没有详细说明何时或是否应该使用它。

所以我做了一些逆向工程,上面布局的原因在下面的代码中:

for (final ArrayPatternConverter converter : patternConverters) {
if (converter instanceof DatePatternConverter) {
final DatePatternConverter dateConverter = (DatePatternConverter) converter;
frequency = calculateFrequency(dateConverter.getPattern());
}
}

所以在我的第一种情况下,完全替换的 filePattern 看起来像这样:logs/%d{yyyy_MM_HH_mm}/appl_log_%d{yyyy_MM_dd}.txt

PatternConverter类的上述代码将从%d{yyyy_MM_HH_mm}中拾取第一个转换器,以确定要EVERY_MINUTE的频率,然后它会检测到覆盖旧频率的%d{yyyy_MM_dd}EVERY_MINUTEDAILY.执行翻转时,它会创建一个伪日志事件,其中包含一个时间(由于频率DAILY在一天开始时(来格式化文件时间,使其以 00_00 结束。

长话短说,当您使用%格式时,解析器使用的是日志事件的时间,这可能不是发生翻转时的当前系统时间。使用$$属性查找时,与日志事件无关,因此您始终以指定的格式获取当前时间。

最新更新