查找和模式之间的区别
Difference between lookup and pattern
在一个关于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
class 的代码将从 %d{yyyy_MM_HH_mm}
获取第一个转换器,确定 EVERY_MINUTE
的频率,然后它检测 %d{yyyy_MM_dd}
将 EVERY_MINUTE
的旧频率覆盖为 DAILY
。进行翻转时,它会创建一个带有时间的伪日志事件(由于 DAILY
频率,在一天的开始)来格式化文件时间,因此它以 00_00.
结束
长话短说,当您使用 %
格式时,解析器使用的是日志事件的时间,这可能不是发生翻转时的当前系统时间。使用 $$
属性 查找时,与日志事件没有任何关系,因此您始终以指定的格式获取当前时间。
在一个关于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
class 的代码将从 %d{yyyy_MM_HH_mm}
获取第一个转换器,确定 EVERY_MINUTE
的频率,然后它检测 %d{yyyy_MM_dd}
将 EVERY_MINUTE
的旧频率覆盖为 DAILY
。进行翻转时,它会创建一个带有时间的伪日志事件(由于 DAILY
频率,在一天的开始)来格式化文件时间,因此它以 00_00.
长话短说,当您使用 %
格式时,解析器使用的是日志事件的时间,这可能不是发生翻转时的当前系统时间。使用 $$
属性 查找时,与日志事件没有任何关系,因此您始终以指定的格式获取当前时间。