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

在我的Log4j2配置文件中,我有这个:

   log-dir/ default-log-file  

现在,在我的一些代码中,我创建了自定义记录器。 我需要访问“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配置可以作为属性查找来访问它。

这看起来像这样:

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

     baseDir=log-dir 
  2. log4j2xml定义如下:

      ${bundle:logsCommons:baseDir}/ default-log-file  

来自OP:

除了将baseDir的值移动到属性文件并将其作为${bundle:logsCommon:baseDir}引用之外,如上所述,我这样做是为了得到我的实际解决方案:

获得StrSubstitutor:

 String baseDirVar = configuration.getStrSubstitutor().getVariableResolver().look‌​up("baseDir"); 

然后我需要做一个替换:

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

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