如何在运行时访问已配置的Log4J appender?

时间:2009-12-15 19:43:32

标签: java logging log4j

我想在启动时配置一个appender,然后根据需要从各种记录器中动态添加和删除它。我宁愿让log4j自己配置这个appender,只需在需要时获取它的引用。如果那是不可能的,我将不得不自己实例化appender并坚持下去。

6 个答案:

答案 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)

我会这样做:

  1. 让你在log4j.properties中指定的appender,但没有添加到root logger。
  2. 在运行时,在需要时,抓取log4j.properties,从中提取您需要的属性,实例化您的appender并通过读取提取的属性来设置其选项。
  3. 激活appender
  4. Logger.getRootLogger()addAppender(附加器);
  5. 完成使用后将其关闭 - Logger.getRootLogger()。removeAppender(..)
  6. 现在,如果这是你自己的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());
    }