[英]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使用的任何资源(例如文件)都是预先创建的,即使它们没有被使用。
我会这样做:
现在,如果这是你自己的appender,那么做(2)会很容易,因为你知道属性的含义并知道会发生什么。 否则,您可能希望在执行(3)之前使用反射来实例化类并调用其属性setter。
如果它是在你想要的运行时启用/禁用Appender,那么我找到了另一个解决方案(虽然不是很优雅)。 使用log4j配置添加您正常需要的所有Appender。
在运行时,如果要“禁用”appender,请向其添加一个(org.apache.log4j.spi)过滤器,以便为每条日志消息返回Filter.DENY。 这样,没有消息可以通过这个Appender。 当您想要“启用”Appender时,只需清除上面添加的过滤器即可。
我对此进行了测试,它对我们来说效果很好(log4j 1.2)。
我认为您正在寻找的代码是:
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());
}
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.