【问题标题】:Getting properties programmatically from Log4j2 XML config从 Log4j2 XML 配置中以编程方式获取属性
【发布时间】:2017-05-23 18:37:03
【问题描述】:

在我的 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


【解决方案1】:

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

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

【讨论】:

  • 这是否意味着我的代码需要通过加载属性文件来访问baseDir?或者我可以通过 log4j2 API 访问它吗?
  • 我想通了!首先,我需要获取 StrSubstitutor:String baseDirVar = configuration.getStrSubstitutor().getVariableResolver().lookup("baseDir"); 然后我需要进行替换:String baseDir = configuration.getStrSubstitutor().replace(baseDirVar); 现在我可以可靠地获取(并在必要时修改)现在来自属性文件的日志记录基目录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 2014-01-31
  • 2019-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多