【问题标题】:How can I access the configured Log4J appenders at runtime?如何在运行时访问已配置的 Log4J 附加程序?
【发布时间】:2010-12-26 23:05:50
【问题描述】:

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

【问题讨论】:

  • 我想做同样的事情。我想在 log4j.properties 中配置 appenders,然后选择一些并在运行时动态添加到 rootLogger。

标签: java logging log4j


【解决方案1】:

我认为您正在寻找的代码是:

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());
    }

【讨论】:

    【解决方案2】:

    如果您想要在运行时启用/禁用 Appender,那么我找到了另一个解决方案(虽然不是很优雅)。使用 log4j 配置添加你需要的所有 Appender,就像你通常做的那样。

    在运行时,当您想“禁用”附加程序时,向其添加一个 (org.apache.log4j.spi) 过滤器,该过滤器会为每条日志消息返回 Filter.DENY。这样,这个 Appender 就没有消息通过了。当您想“启用” Appender 时,只需清除您在上面添加的过滤器即可。

    我对此进行了测试,它对我们很有效(log4j 1.2)。

    【讨论】:

      【解决方案3】:

      我会这样做:

      1. 您是否在 log4j.properties 中指定了 appender,但未添加到 root logger。
      2. 在运行时,当需要时,获取 log4j.properties,从中提取您需要的属性,实例化您的 appender 并通过读取提取的属性来设置其选项。
      3. 激活附加程序
      4. Lo​​gger.getRootLogger().addAppender(appender);
      5. 使用完毕后启动它 - Logger.getRootLogger().removeAppender(..)

      现在,如果这是您自己的附加程序,那么执行 (2) 将很容易,因为您知道属性的含义并知道会发生什么。否则,您可能希望使用反射来实例化该类并在执行 (3) 之前调用其属性设置器。

      【讨论】:

        【解决方案4】:

        我想做同样的事情。我想在 log4j.properties 中配置 appenders,然后选择一些并在运行时动态添加到 rootLogger。

        我不知道如何访问附加程序,而不是通过附加它们的记录器,所以我最终创建了一个 虚拟记录器,并将附加程序附加到它,这样我就可以动态检索它们。这并不理想,因为附加程序使用的任何资源(例如文件)都是预先创建的,即使它们没有被使用。

        【讨论】:

        • 我认为这确实是唯一的解决方案。 appender 注册表对PropertyConfiguratorDOMConfigurator 是私有的。一旦完成,PropertyConfigurator 甚至会清除其注册表。
        【解决方案5】:

        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 中检索一个 appender,如果它已经被配置为附加到它。但是,我正在寻找一种方法来获取在启动时配置的附加程序,该附加程序已附加到记录器。
        【解决方案6】:

        Logger 类具有 getAllAppenders()getAppender()addAppender()removeAppender() 方法的方法,这些方法继承自 Category 类。但是,Category 类已被弃用,最重要的是,我以前从未尝试过这样做,但这可能是一个有用的起点。

        【讨论】:

        • Category 已被 Logger 类取代。 Logger 只是继承自 Category。所以,如果 Category 的方法本身没有被弃用,那么使用它是完全可以的。
        • 使用 getAppender() 或 getAllAppenders() 不是假设 appender 已经在 Logger 上吗?我想在启动时配置 Appender,但不要在启动时将其附加到任何类别。只有在运行时,我才会抓住它在 Logger 上调用 addAppender()。
        • 这可能就是我最终要做的事情。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多