繁体   English   中英

如何在运行时访问配置的 Log4J 附加程序?

[英]How can I access the configured Log4J appenders at runtime?

我想在启动时配置一个附加程序,然后根据需要从各种记录器中动态添加和删除它。 我更愿意让 log4j 自己配置这个附加程序,并在需要时获取对它的引用。 如果那不可能,我将不得不自己实例化 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);

我很确定你可以在其他记录器上执行此操作,而不是根记录器,尽管我从未尝试过。

Logger类具有继承自Category类的getAllAppenders()getAppender()addAppender()removeAppender()方法。 但是,不推荐使用Category类,除此之外,我之前从未尝试过这样做,但这可能是一个有用的起点。

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

我无法弄清楚除了通过它们附加的记录器之外如何访问appender,所以我最终创建了一个虚拟记录器 ,并将appender附加到它,以便我可以动态地检索它们。 这并不理想,因为appender使用的任何资源(例如文件)都是预先创建的,即使它们没有被使用。

我会这样做:

  1. 你有没有在log4j.properties中指定的appender,但没有添加到root logger。
  2. 在运行时,在需要时,抓取log4j.properties,从中提取您需要的属性,实例化您的appender并通过读取提取的属性来设置其选项。
  3. 激活appender
  4. 。Logger.getRootLogger()addAppender(附加器);
  5. 使用完毕后将其关闭 - Logger.getRootLogger()。removeAppender(..)

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

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

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

我对此进行了测试,它对我们来说效果很好(log4j 1.2)。

Log4j1

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

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

Log4j2

import org.apache.log4j.Appender;

import org.apache.log4j.Logger;

//stuff

    ((org.apache.logging.log4j.core.Logger) LogManager.getLogger()).getAppenders().values().forEach(a -> {
        System.out.println("appender.getName() " + a.getName());
    });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM