回答这个问题让我更困惑,而不是开明。
在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}
?
谁能澄清这个困惑?
1条答案
按热度按时间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{...}
使用上一次滚动的日期。这两个日期可能相差一个滚动期间。