【发布时间】:2014-01-01 10:20:58
【问题描述】:
我需要以编程方式设置文件附加程序。
我想在 log4j2.xml 上设置我的附加程序,但我想(以编程方式)在运行时仅写入这些附加程序之一。
<Configuration status="WARN">
<Appenders>
<File name="File_1" fileName="c:/FILE_1.log" >
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
<File name="File_2" fileName="c:/FILE_2.log" >
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
<File name="File_3" fileName="c:/FILE_3.log" >
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="File_1"/>
<AppenderRef ref="File_2"/>
<AppenderRef ref="File_3"/>
</Root>
</Loggers>
示例:
if(condition.equals("A")){
//write log on File_1
}else if(condition.equals("B")){
//write log on File_2
}else {
//write log on File_3
}
查看 Internet 上的各种教程,他们解释了如何在运行时以编程方式添加附加程序;有没有办法选择 在运行时只有 xml 配置文件中定义的 appender 之一?
第一个解决方案:
我尝试通过以下方式解决问题,但我对我的解决方案不满意,因为 log4j2.xml 中定义的文件没有以编程方式删除,并且 第一个 Appender 永远不会被删除! 我认为 log4j2 中存在错误:https://issues.apache.org/jira/browse/LOG4J2-135(状态已解决但我不这么认为...我正在使用 log4j-2.0-beta9)
static org.apache.logging.log4j.core.Logger coreLogger =
(org.apache.logging.log4j.core.Logger)LogManager.getLogger(MyClass.class.getName());
static LoggerContext context = (LoggerContext)coreLogger.getContext();
static BaseConfiguration configuration = (BaseConfiguration)context.getConfiguration();
static String FILE_1 = "File_1";
static String FILE_2 = "File_2";
static String FILE_3 = "File_3";
private static Map<String, Boolean> appendersMap;
static
{
appendersMap = new HashMap<String, Boolean>();
appendersMap.put(FILE_1, true);
appendersMap.put(FILE_2, true);
appendersMap.put(FILE_3, true);
}
/**
* Configure appenders.
*
* @param appender the appender
*/
public static void configureAppenders(String appender){
if(appender.equals(FILE_1)){
addAppenders(FILE_1);
removeAppenders(FILE_2,FILE_3);
}
else if(appender.equals(FILE_3)){
addAppenders(FILE_3);
removeAppenders(FILE_1,FILE_2);
}
else if(appender.equals(FILE_2)){
addAppenders(FILE_2);
removeAppenders(FILE_1,FILE_3);
}
}
private static void addAppenders(String appender){
if (!appendersMap.get(appender)){
appendersMap.put(appender, true);
coreLogger.addAppender(configuration.getAppender(appender));
}
}
private static void removeAppenders(String... appenders){
for(String appender : appenders){
appendersMap.put(appender, false);
coreLogger.removeAppender(configuration.getAppender(appender));
}
}
【问题讨论】:
-
思科,老兄,你的代码对我帮助很大。在看到您的代码之前,我无法附加我的附加程序。
标签: java logging log4j log4j2 appender