我如何在运行时访问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的,即使它们没有被使用,但这并不理想。
我会这样做:
- 你有appender在log4j.properties中指定,但没有添加到根logging器。
- 在运行时,需要的时候,抓住log4j.properties,从中提取你需要的属性,实例化你的appender,并通过读取提取的属性来设置它的选项。
- 激活appender
- 。Logger.getRootLogger()addAppender(附加器);
- 踢完它使用它 – 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)。