以编程方式从 Log4j2 XML 配置获取属性

问题描述 投票:0回答:2

在我的 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”的属性,以便我可以通过编程方式创建一个新的记录器,但使用不同的基目录?

java log4j2
2个回答
7
投票

context.getConfiguration() 返回的类 Configuration 不是一种 PropertyConfiguration 类。它不能用于访问 log4j2.xml 值,因为它是非常不同的 Configuration 类,专为日志记录设置而定制。

可以将 baseDir 定义提取到单独的属性文件中。这为编程式和非编程式 log4j 配置提供了公共源:以编程方式,它可以作为常规属性配置文件进行访问; log4j2 配置可以将其作为属性查找来访问。

这看起来像这样:

  1. 外部属性文件logsCommons.properties与log4j2.xml位于同一文件夹中,并具有以下属性:

    baseDir=log-dir
    
  2. 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().look‌​up("baseDir"); 

然后我需要更换:

String baseDir = configuration.getStrSubstitutor().replace(baseDirVar);

现在我可以可靠地获取(并在必要时修改)来自属性文件的日志记录基目录。


0
投票

我们如何修改属性变量?

© www.soinside.com 2019 - 2024. All rights reserved.