布局中美元模式和百分比模式之间的Log4j差异

cidc1ykv  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(152)

回答这个问题让我更困惑,而不是开明。
在log4j2配置文件中指定当前日期(使用自定义格式)似乎有几种方法:

  • 第一次
  • 第一次

(有趣的是,log4j2文档在它们的示例中始终使用$${date:...},但将美元字符should escape it加倍,使其成为一个字面上的美元字符,后面跟着一个花括号和单词“date”、一个冒号、格式和右括号。)
如果有区别的话,一种形式和另一种形式之间有什么区别?什么时候应该使用一种而不是另一种?
在单个值中一起使用时是否有区别?示例包含以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
  <Properties>
    <Property name="baseDir">logs</Property>
  </Properties>
  <Appenders>
    <!-- HERE: -->
    <RollingFile name="RollingFile" fileName="${baseDir}/app.log"
          filePattern="${baseDir}/$${date:yyyy-MM}/app-%d{yyyy-MM-dd}.log.gz">
      <PatternLayout pattern="%d %p %c{1.} [%t] %m%n" />
      <CronTriggeringPolicy schedule="0 0 0 * * ?"/>
      <DefaultRolloverStrategy>
        <Delete basePath="${baseDir}" maxDepth="2">
          <IfFileName glob="*/app-*.log.gz" />
          <IfLastModified age="P60D" />
        </Delete>
      </DefaultRolloverStrategy>
    </RollingFile>
  </Appenders>
  <Loggers>
    <Root level="error">
      <AppenderRef ref="RollingFile"/>
    </Root>
  </Loggers>
</Configuration>

1.为什么$${date:yyyy-MM}前面的是双美元,而${baseDir}前面的只有一美元?
1.为什么是${date:yyyy-MM}%d{MM-dd-yyyy},而不是%d{yyyy-MM}${date:MM-dd-yyyy}
谁能澄清这个困惑?

5kgi1eie

5kgi1eie1#

%d{...}这样的模式占位符可用于:

  • 模式布局的pattern属性(参见文档)和JSON模板布局的pattern解析器中的扩展(参见documentation)。这些模式被替换为记录器的LogEvent的属性,
  • 滚动文件附加器的filePattern属性(仅%i%d)。这些模式将替换为正在创建的归档日志文件的索引和日期模式。

另一方面,查找占位符${type:key}可以在配置文件中的任何地方使用,并且在读取文件时急切地被替换(参见lookups)。因此,滚动文件附加器的fileName属性将logs/app.log作为值。
然而,还有第二个查找应用:某些属性(包括所有接受%模式的属性)接受将在以后计算的${...}查找。为了防止在配置时计算这些查找,您需要将$转义为$$
这就是配置文件中的${baseDir}/$${date:yyyy-MM}/app-%d{yyyy-MM-dd}.log.gz字符串为以下内容的原因:
1.在配置时被评估为logs/${date:yyyy-MM}/app-%{yyyy-MM-dd}.log.gz
1.如果今天发生翻转,则进一步评估为logs/2022-04/app-2022-04-16.log.gz
如果您使用${date:yyyy-MM}而不是$${date:yyyy-MM},则所有日志文件都将位于logs/2022-04文件夹中(直到重新配置发生)。
$${date:yyyy-MM-dd}%d{yyyy-MM-dd}之间的差异特定于滚动文件追加器:附加器需要知道翻转发生的频率。它通过分析%d{...}模式来实现这一点。这就是为什么在您的配置中翻转每天发生(%d{yyyy-MM-dd})而不是每月发生($${date:yyyy-MM})。
这两者之间的另一个区别是它们使用的日期:$${date:...}使用当前日期,而%d{...}使用上一次滚动的日期。这两个日期可能相差一个滚动期间。

相关问题