查找和模式之间的区别

时间:2018-10-16 06:45:27

标签: java log4j log4j2

在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.),但不详细说明何时或是否应使用。

1 个答案:

答案 0 :(得分:0)

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

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结尾。

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