我如何在运行时访问configuration的Log4J appender?

我想在启动时configuration一个appender,然后根据需要dynamic添加并从各种logging器中删除它。 我宁愿有log4jconfiguration这个appender本身,只是在需要的时候抓住一个引用。 如果这是不可能的,我将不得不自己实例化appender,并坚持下去。

Appender通常被添加到根logging器。 这是一些伪代码

// 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); 

我敢肯定,你可以在根logging器上做其他logging器,但我从来没有尝试过。

Logger类具有从Category类inheritance的getAllAppenders() , getAppender() , addAppender()和removeAppender()方法。 不过,Category类已经被弃用了,最重要的是,我从来没有尝试过这样做,但这可能是一个有用的起点。

我想要做同样的事情。 我想在log4j.properties中configurationappender,然后select一些并在运行时dynamic添加到rootLogger。

我不知道如何通过他们已经附加的logging器访问appender,所以我最终创build了一个虚拟logging器 ,并附加appender到它,所以我可以dynamic地检索他们。 尽pipeappender使用的任何资源(例如文件)都是预先创build的,即使它们没有被使用,但这并不理想。

我会这样做:

  1. 你有appender在log4j.properties中指定,但没有添加到根logging器。
  2. 在运行时,需要的时候,抓住log4j.properties,从中提取你需要的属性,实例化你的appender,并通过读取提取的属性来设置它的选项。
  3. 激活appender
  4. 。Logger.getRootLogger()addAppender(附加器);
  5. 踢完它使用它 – Logger.getRootLogger()。removeAppender(..)

现在,如果这是你自己的appender,做(2)将是容易的,因为你知道属性的意义,并知道什么期望。 否则,你可能会想要使用reflection来实例化类,并在做(3)之前调用它的属性设置器。

如果是在运行时启用/禁用Appender,那么我会发现另一个解决scheme(虽然不是很优雅)。 使用log4jconfiguration添加所有你需要的Appender,就像你正常做的那样。

在运行时,当你想“禁用”一个appender时,添加一个(org.apache.log4j.spi)Filter来为每个日志消息返回Filter.DENY。 这种方式没有消息通过这个Appender。 当你想要启用Appender时,只需清除上面添加的filter即可。

我testing了这一点,它适合我们(log4j 1.2)。