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



在我的 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();

但是返回的地图具有键"主机名"和"上下文名称"。不是我要找的属性图。

我想我也许可以从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 配置可以将其作为属性查找进行访问。

这看起来像这样:

  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);

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

最新更新