【问题标题】:Retrieve List of Log4J Appenders at Run Time在运行时检索 Log4J Appender 列表
【发布时间】:2012-12-24 18:44:42
【问题描述】:

是否可以在运行时检索 log4j 中配置的所有 appender 的列表?

我将进一步充实这个场景。鉴于以下配置,我将如何检索所有附加程序(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

【问题讨论】:

  • 您使用的是 lo4j 1.2 还是 log4j2 ?标记两者会令人困惑,因为它们具有不同的 API。

标签: java logging log4j


【解决方案1】:

如果您想访问为所有记录器配置的所有附加程序,您必须执行类似的操作

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

【讨论】:

  • 这可行,但它与我们的需要并不真正相关。我正在创建一个日志配置应用程序,以便我们可以动态创建/修改记录器。这基本上需要当前未使用的附加程序。最后,我刚刚创建了一个配置了所有附加程序并始终设置为 OFF 的记录器。
  • 这可能适用于 log4j,但绝对不适用于 log4j2,因为在 log4j2 中既没有 LogManager.getCurrentLoggers(),也没有 Logger.getAllAppenders()。
  • 那么你如何在 log4j2 中做到这一点
  • 什么是LogManager?
【解决方案2】:

这是你需要的一个

log4j Method getAllAppenders

【讨论】:

  • 这只是获取所有附加到记录器的附加程序,不是吗?
  • 完全不推荐这个。来自该类的文档:“此类已被弃用并被 Logger 子类取代。它将保留下来以保持向后兼容性,直到 2003 年中期。”
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    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();
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 2011-05-15
      • 2019-04-19
      • 1970-01-01
      • 2018-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多