在运行时检索Log4J应用者的列表[英] Retrieve List of Log4J Appenders at Run Time

本文是小编为大家收集整理的关于在运行时检索Log4J应用者的列表的处理/解决方法,可以参考本文帮助大家快速定位并解决问题,中文翻译不准确的可切换到English标签页查看源文。

问题描述

可以在运行时检索所有在log4j中配置的附录的列表吗?

我会再充实情况.给定以下配置,我将如何检索所有附录(stdout and altStdout)?

log4j.rootLogger=error, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.altstdout=org.apache.log4j.ConsoleAppender
log4j.appender.altstdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.appender.altstdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

推荐答案

如果要访问为所有登录器配置的所有附录,则必须执行此类操作

for (Enumeration loggers=LogManager.getCurrentLoggers(); loggers.hasMoreElements(); )  {
    Logger logger = (Logger) loggers.nextElement();
    for (Enumeration appenders=logger.getAllAppenders(); appenders.hasMoreElements(); )  {
        Appender appender = (Appender) appenders.nextElement();
        ...

我不知道为什么log4j没有像logmanager.getallappenders()这样的方法,但是看起来像
劣势.

其他推荐答案

这是您需要的

在/a>

其他推荐答案

我想添加一些花我一段时间才能理解的东西. 如果您查看下图(我从手动">您可以看到,在这里),即使Logger com.foo.bar将打印到Roogger Fileappender,但其Appender列表仍然为null.因此,您无法获得所有附录的记录器将使用方法logger.getAllAppenders().

写入.

在此处输入图像描述

为此,您还需要单独迭代所有父母和根记录仪.因为您不能迭代logger.getParent() root logger(root logger返回null-请参阅getParent())的文档.据我所知,您必须通过Logger.getRootLogger().getAllAppenders().

分开访问rootlogger的附属

本文地址:https://www.itbaoku.cn/post/1574829.html

问题描述

Is it possible to retrieve a list of all appenders configured in log4j at run time?

I'll flesh out the scenario a little more. Given the following config how would I retrieve all appenders (stdout and altstdout)?

log4j.rootLogger=error, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.altstdout=org.apache.log4j.ConsoleAppender
log4j.appender.altstdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.appender.altstdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

推荐答案

If you want access to all appenders configured for all loggers you must do something like this

for (Enumeration loggers=LogManager.getCurrentLoggers(); loggers.hasMoreElements(); )  {
    Logger logger = (Logger) loggers.nextElement();
    for (Enumeration appenders=logger.getAllAppenders(); appenders.hasMoreElements(); )  {
        Appender appender = (Appender) appenders.nextElement();
        ...

I don't know why log4j has no method like LogManager.getAllAppenders(), but it looks like
disadvantage.

其他推荐答案

This is one what you need

log4j Method getAllAppenders

其他推荐答案

I want to add something that took me a while to understand. If you look at the figure below (which I copied from here), you can see, that even though the logger com.foo.bar will print to the root loggers FileAppender, its appender list is still null. So you cannot get all appenders the logger will write to with the method logger.getAllAppenders().

enter image description here

For this you need to iterate through all the parents also and the root logger seperately. Because you cannot iterate logger.getParent() to root logger (root logger returns null - see documentation of getParent()). As far as I know, you have to access the rootLoggers' appenders seperately via Logger.getRootLogger().getAllAppenders().