我想在启动时配置一个appender,然后根据需要从各种记录器中动态添加和删除它。我宁愿让log4j自己配置这个appender,只需在需要时获取它的引用。如果那是不可能的,我将不得不自己实例化appender并坚持下去。
答案 0 :(得分:24)
Appender通常会添加到根记录器中。这是一些伪代码
// 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);
我很确定你可以在其他记录器上执行此操作,而不是根记录器,尽管我从未尝试过。
答案 1 :(得分:3)
Logger类包含继承自getAllAppenders()类的getAppender(),addAppender(),removeAppender()和Category方法。但是,不推荐使用Category类,除此之外,我以前从未尝试过这样做,但这可能是一个有用的起点。
答案 2 :(得分:3)
我想做同样的事情。我想在log4j.properties中配置appender,然后选择一些并在运行时动态添加到rootLogger。
我无法弄清楚除了通过它们附加的记录器之外如何访问appender,所以我最终创建了一个虚拟记录器,并将appender附加到它以便我可以动态检索它们。这并不理想,因为appender使用的任何资源(例如文件)都是预先创建的,即使它们没有被使用。
答案 3 :(得分:0)
我会这样做:
现在,如果这是你自己的appender,那么做(2)会很容易,因为你知道属性的含义并知道会发生什么。否则,您可能希望在执行(3)之前使用反射来实例化类并调用其属性setter。
答案 4 :(得分:0)
如果它是在你想要的运行时启用/禁用Appender,那么我找到了另一个解决方案(虽然不是很优雅)。使用log4j配置添加您正常需要的所有Appender。
在运行时,您希望"禁用"一个appender添加一个(org.apache.log4j.spi)过滤器,它为每条日志消息返回Filter.DENY。这样,没有消息可以通过这个Appender。当你想要"启用" Appender后退只清除您在上面添加的过滤器。
我对此进行了测试,它适用于我们(log4j 1.2)。
答案 5 :(得分:0)
我认为您正在寻找的代码是:
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());
}