【发布时间】:2010-12-26 23:05:50
【问题描述】:
我想在启动时配置一个附加程序,然后根据需要从各种记录器中动态添加和删除它。我宁愿让 log4j 自己配置这个附加程序,并在需要时获取对它的引用。如果这不可能,我将不得不自己实例化 appender 并坚持下去。
【问题讨论】:
-
我想做同样的事情。我想在 log4j.properties 中配置 appenders,然后选择一些并在运行时动态添加到 rootLogger。
我想在启动时配置一个附加程序,然后根据需要从各种记录器中动态添加和删除它。我宁愿让 log4j 自己配置这个附加程序,并在需要时获取对它的引用。如果这不可能,我将不得不自己实例化 appender 并坚持下去。
【问题讨论】:
我认为您正在寻找的代码是:
import org.apache.log4j.Appender;
import org.apache.log4j.Logger;
//stuff
Enumeration enm = Logger.getRootLogger().getAllAppenders();
Appender appender = null;
while(enm.hasMoreElements()){
appender = (Appender)enm.nextElement();
System.out.println("appender.getName():"+appender.getName());
}
【讨论】:
如果您想要在运行时启用/禁用 Appender,那么我找到了另一个解决方案(虽然不是很优雅)。使用 log4j 配置添加你需要的所有 Appender,就像你通常做的那样。
在运行时,当您想“禁用”附加程序时,向其添加一个 (org.apache.log4j.spi) 过滤器,该过滤器会为每条日志消息返回 Filter.DENY。这样,这个 Appender 就没有消息通过了。当您想“启用” Appender 时,只需清除您在上面添加的过滤器即可。
我对此进行了测试,它对我们很有效(log4j 1.2)。
【讨论】:
我会这样做:
现在,如果这是您自己的附加程序,那么执行 (2) 将很容易,因为您知道属性的含义并知道会发生什么。否则,您可能希望使用反射来实例化该类并在执行 (3) 之前调用其属性设置器。
【讨论】:
我想做同样的事情。我想在 log4j.properties 中配置 appenders,然后选择一些并在运行时动态添加到 rootLogger。
我不知道如何访问附加程序,而不是通过附加它们的记录器,所以我最终创建了一个 虚拟记录器,并将附加程序附加到它,这样我就可以动态检索它们。这并不理想,因为附加程序使用的任何资源(例如文件)都是预先创建的,即使它们没有被使用。
【讨论】:
Appenders 通常被添加到根 logger。这是一些伪代码
// get the root logger and remove the appender we want
Logger logger = Logger.getRootLogger();
Appender appender = logger.getAppender("foo");
logger.removeAppender(appender)
// when we want to add it back...
logger.addAppender(appender);
我很确定您也可以在根记录器以外的其他记录器上执行此操作,尽管我从未尝试过。
【讨论】:
Logger 类具有 getAllAppenders()、getAppender()、addAppender() 和 removeAppender() 方法的方法,这些方法继承自 Category 类。但是,Category 类已被弃用,最重要的是,我以前从未尝试过这样做,但这可能是一个有用的起点。
【讨论】:
Category 已被 Logger 类取代。 Logger 只是继承自 Category。所以,如果 Category 的方法本身没有被弃用,那么使用它是完全可以的。