以编程方式从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配置可以作为属性查找来访问它。
这看起来像这样:
-
外部属性文件logsCommons.properties与log4j2.xml位于同一文件夹中,并具有以下属性:
baseDir=log-dir
-
log4j2xml定义如下:
${bundle:logsCommons:baseDir}/ default-log-file
来自OP:
除了将baseDir的值移动到属性文件并将其作为${bundle:logsCommon:baseDir}
引用之外,如上所述,我这样做是为了得到我的实际解决方案:
获得StrSubstitutor:
String baseDirVar = configuration.getStrSubstitutor().getVariableResolver().lookup("baseDir");
然后我需要做一个替换:
String baseDir = configuration.getStrSubstitutor().replace(baseDirVar);
现在,我可以可靠地获取(并在必要时修改)用于记录的基本目录,该目录现在来自属性文件。