在运行时检索Log4J Appenders列表

15

在运行时检索log4j中配置的所有附加程序列表是否可能?

我将更详细地描述场景。 鉴于以下配置,如何检索所有附加程序(stdout和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

1
你正在使用lo4j 1.2还是log4j2?将它们都打上标签会令人困惑,因为它们具有不同的API。 - Simulant
4个回答

17

如果你想访问所有配置为所有记录器(logger)的附加器(appender),你必须像这样做

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()这样的方法,但它看起来像是一个劣势。


1
那个也可以,但它并不符合我们的需求。我正在创建一个日志配置应用程序,以便我们可以动态地创建/修改记录器。这基本上需要当前未使用的附加器。最后,我只是创建了一个配置了所有附加器并始终设置为关闭状态的记录器。 - binarymelon
3
这可能适用于log4j,但绝对不适用于log4j2,因为在log4j2中没有LogManager.getCurrentLoggers()和Logger.getAllAppenders()方法。 - Joe
3
那么在log4j2中,你如何做到这一点呢? - Stealth Rabbi
什么是LogManager? - john k

0

Log4j 1的工作解决方案:

注意:getAllAppenders只会获取活动日志,而不是在log4j.xml配置文件中定义的所有文件的完整列表。

以下是我如何实现为所有日志文件设置rwxrwxrwx权限的方法:

@SuppressWarnings("unchecked")
public static <E> E safeCastNoException(Object o, Class<E> target)
{
  if(target.isInstance(o)) return (E)o;
  return null;
}
    {

        URL file;
        try
        {
            LogManager.resetConfiguration();
            file = new URL("file:" + Log4jXMLConfigFileName);
            // We override DOMConfigurator to catch Appender settings
            // in parseAppender and rework file rights access
            new DOMConfigurator()
            {
                @Override
                protected Appender parseAppender(Element appenderElement)
                {
                    Appender a = super.parseAppender(appenderElement);

                    FileAppender fileAppender = safeCastNoException(a, FileAppender.class);
                    if( fileAppender != null )
                    {
                        String filePath=fileAppender.getFile();

                        Path pathTofile = FileSystems.getDefault().getPath(filePath);
                        try
                        {
                            // Create the empty file with default permissions, etc.
                            Files.createFile(pathTofile);
                        }
                        catch(FileAlreadyExistsException x)
                        {
                            System.err.format("file named %s already exists, no need to recreate%n", pathTofile);
                        }
                        catch(Exception x)
                        {
                            // Some other sort of failure, such as permissions.
                            System.err.format("createFile error: %s%n", x);
                        }

                        try
                        {
                            //using PosixFilePermission to set file permissions 777
                            Set<PosixFilePermission> perms = new HashSet<PosixFilePermission>();
                            //add owners permission
                            perms.add(PosixFilePermission.OWNER_READ);
                            perms.add(PosixFilePermission.OWNER_WRITE);
                            //perms.add(PosixFilePermission.OWNER_EXECUTE);
                            //add group permissions
                            perms.add(PosixFilePermission.GROUP_READ);
                            perms.add(PosixFilePermission.GROUP_WRITE);
                            //perms.add(PosixFilePermission.GROUP_EXECUTE);
                            //add others permissions
                            perms.add(PosixFilePermission.OTHERS_READ);
                            perms.add(PosixFilePermission.OTHERS_WRITE);
                            //perms.add(PosixFilePermission.OTHERS_EXECUTE);
                            System.out.println("Trying to set 666 posix rights to log file: " + pathTofile.toAbsolutePath().toString());
                            Files.setPosixFilePermissions(Paths.get(pathTofile.toAbsolutePath().toString()), perms);
                        }
                        catch(Exception x)
                        {
                            // Some other sort of failure, such as permissions.
                            System.err.format("chmod error: %s%n", x);
                        }
                    }
                    return a;
                }
            }.
            doConfigure(file, LogManager.getLoggerRepository());
        }
        catch (Exception e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

0

1
这只是获取附加到记录器的所有附加器,不是吗? - binarymelon
绝不建议这样做。从类的文档中可以看到:“此类已被弃用并由Logger子类替换。为了保持向后兼容性,它将保留到2003年中期。” - ke4ktz

0
我想补充一些我花了一段时间才理解的内容。 如果您查看下面的图(我从 这里复制),您可以看到,即使记录器com.foo.bar将打印到根记录器的FileAppender中,但其附加程序列表仍为空。 因此,您无法使用方法logger.getAllAppenders()获取记录器将写入的所有附加程序。

enter image description here

为此,您需要分别迭代所有父记录器和根记录器。因为您无法迭代logger.getParent()到根记录器(根记录器返回null-请参阅getParent()的文档)。据我所知,您必须通过Logger.getRootLogger().getAllAppenders()单独访问rootLoggers的附加程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接