在我的 Log4j2 配置文件中,我有这个:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" strict="true" name="XMLConfig" packages="org.apache.logging.log4j.test">
<Properties>
<Property name="baseDir">log-dir/</Property>
<Property name="defaultLogfileName">default-log-file</Property>
</Properties>
现在,在我的一些代码中,我创建了自定义记录器。我需要访问“baseDir”的值并更改它。我尝试过在上下文中使用
getProperties
,如下所示:
LoggerContext context = (LoggerContext) LogManager.getContext(false);
Configuration configuration = context.getConfiguration();
configuration.getProperties();
但是返回的映射具有键“hostname”和“contextName”。不是我正在寻找的属性图。
我想我也许可以从 rootLogger 获取它:
LoggerContext context = (LoggerContext) LogManager.getContext(false);
Configuration configuration = context.getConfiguration()
for (Property p : configuration.getRootLogger().getPropertyList())
{
...
}
但这会产生 NullPointerException,因为 getPropertyList 返回 null。
那么,如何访问名称为“baseDir”的属性,以便我可以通过编程方式创建一个新的记录器,但使用不同的基目录?
由 context.getConfiguration() 返回的类 Configuration 不是一种 PropertyConfiguration 类。它不能用于访问 log4j2.xml 值,因为它是非常不同的 Configuration 类,专为日志记录设置而定制。
可以将 baseDir 定义提取到单独的属性文件中。这为编程式和非编程式 log4j 配置提供了公共源:以编程方式,它可以作为常规属性配置文件进行访问; log4j2 配置可以将其作为属性查找来访问。
这看起来像这样:
外部属性文件logsCommons.properties与log4j2.xml位于同一文件夹中,并具有以下属性:
baseDir=log-dir
log4j2xml 定义如下:
<Properties>
<Property name="baseDir">${bundle:logsCommons:baseDir}/</Property>
<Property name="defaultLogfileName">default-log-file</Property>
</Properties>
来自OP:
除了将 baseDir 的值移至属性文件并将其引用为
${bundle:logsCommon:baseDir}
之外,我还这样做是为了得到我的实际解决方案:
获取 StrSubstitutor:
String baseDirVar = configuration.getStrSubstitutor().getVariableResolver().lookup("baseDir");
然后我需要更换:
String baseDir = configuration.getStrSubstitutor().replace(baseDirVar);
现在我可以可靠地获取(并在必要时修改)来自属性文件的日志记录基目录。
我们如何修改属性变量?