gpt4 book ai didi

java - 以编程方式初始化 log4j2 的更好方法(二)

转载 作者:搜寻专家 更新时间:2023-11-01 03:04:28 25 4
gpt4 key购买 nike

这就是我在加载 log4j2.xml 文件时所做的,从另一个属性文件指定日志文件位置以保持配置简单以实现支持目的:

MyProperties props = MyProperties.getInstance();
System.setProperty(MyConstants.AUDIT_LOG_ENV_VAR,
props.getAuditLogFileName());
ConfigurationSource source =
new ConfigurationSource(new FileInputStream(new File(
System.getProperty(MyConstants.PROPERTIES_FILE_ENV_VAR)
+ "/log4j2.xml")));
Configurator.initialize(null, source);

并且 log4j2 将获取并使用我的文件名,因为我已经使用 envvar 替换在 Appender 中指定了它:

<File name="AuditLogger" fileName="${sys:AUDIT_LOG}">
<PatternLayout pattern="DATETIME %d{yyyy-MM-dd HH:mm:ss:SSS zzz}%n%msg%n" />
</File>

但是我不喜欢它,因为在下一行代码再次读回文件名值之前,将文件名值推送到系统环境中有一种味道。

我喜欢Configure log4j2 programmatically using ConfigurationFactory但似乎没有类似的方法可以在 log4j2.xml 文件之上构建更多内容 - 或者有吗?

最佳答案

一般log4j2团队不推荐programmatic configuration:api和core jar的分离是为了让开发者明确API和implementation的分离。编程配置依赖于实现细节,因此可能会在未来的版本中中断。

如果有任何无法通过配置完成的事情,请告诉我们,以便我们改进。

对于您的特定用例:您似乎希望在 log4j2 根据该值 初始化自身之前将系统属性设置为某个值。如果这是一个独立的应用程序,避免依赖 log4j2 实现细节的一种方法是在引用任何 log4j2 类之前设置所有必要的系统属性:

public class MainWrapper {
public static void main(String[] args) {
System.setProperty("key", "value");
// ...
ActualMain.main(args); // delegate to the actual start of the application
}
}

我想提请您注意的另一种方法是创建您自己的自定义查找。这可以使用 log4j2 plugin 在几行代码中完成。 .这也依赖于一些实现细节,但结果更强大且可重用。

package com.mycompany;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.lookup.AbstractLookup;
import org.apache.logging.log4j.core.lookup.StrLookup;

/** Looks up keys in MyProperties singleton. */
@Plugin(name = "MyProperties", category = StrLookup.CATEGORY)
public class MyPropertiesLookup extends AbstractLookup {
@Override public String lookup(final LogEvent event, final String key) {
return MyProperties.getInstance().getValue(key);
}
}

然后,在您的配置中,您可以使用自定义查找而不是系统属性:

<File name="AuditLogger" fileName="${MyProperties:AUDIT_LOG}">
<PatternLayout pattern="DATETIME %d{yyyy-MM-dd HH:mm:ss:SSS zzz}%n%msg%n" />
</File>

关于java - 以编程方式初始化 log4j2 的更好方法(二),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27507450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com