在我的 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 配置可以将其作为属性查找进行访问。
这看起来像这样:
-
外部属性文件 logsCommons.properties 与 log4j2 位于同一文件夹中.xml并且具有以下属性:
baseDir=log-dir
-
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().lookup("baseDir");
然后我需要做一个替换:
String baseDir = configuration.getStrSubstitutor().replace(baseDirVar);
现在,我可以可靠地获取(并在必要时修改)现在来自属性文件的日志记录基目录。