【问题标题】:Is it possible to find logback log files programmatically?是否可以通过编程方式找到 logback 日志文件?
【发布时间】:2011-10-27 05:20:58
【问题描述】:

自动附加日志文件以支持电子邮件会很有用。我可以以编程方式设置路径(如在Setting Logback Appender path programmatically 中),但我更愿意让用户通过logback.xml 以熟悉的方式配置日志记录。那么,我可以找到 logback 用于记录的文件吗?

【问题讨论】:

  • 对不起,我不明白这个问题。你能扩大一点吗?
  • @Ceki: 更一般地说,我可以获得 Logback 使用的所有 appender 的列表吗?

标签: java logging logback


【解决方案1】:

您可以获取特定上下文中所有附加程序的列表。为此:

LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory();
for (Logger logger : context.getLoggerList()) {
        for (Iterator<Appender<ILoggingEvent>> index = logger.iteratorForAppenders(); index.hasNext();) {
            Appender<ILoggingEvent> appender = index.next();
        }
    }

这会遍历当前上下文的所有记录器中的所有附加程序列表。

【讨论】:

  • iteratorForAppenders 方法在 logger (slf4j.org/apidocs/org/slf4j/Logger.html) 上不再存在。知道它现在是如何工作的吗?
  • @user3885927 确保您正在导入 ch.qos.logback.classic.Logger 而不是 org.slf4j.Logger !
【解决方案2】:

@tafoo85 给出的答案是正确的,但它只会给你附加程序。

对于 Logback 记录器使用的更具体的获取文件,我希望下面的代码对某些人有所帮助。

File clientLogFile;
FileAppender<?> fileAppender = null;
LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory();
for (Logger logger : context.getLoggerList())
{
     for (Iterator<Appender<ILoggingEvent>> index = logger.iteratorForAppenders();
                 index.hasNext();)
     {
           Object enumElement = index.next();
           if (enumElement instanceof FileAppender) {
                fileAppender=(FileAppender<?>)enumElement;
           }
     }
}

if (fileAppender != null) {
     clientLogFile=new File(fileAppender.getFile());
}
else {
     clientLogFile = null;
}

Log.d("logfile path", clientLogFile.getAbsolutePath());

【讨论】:

  • 正是我所需要的,尽管我将Object enumElement = index.next(); 更改为Appender&lt;ILoggingEvent&gt; enumElement= index.next(); 以及fileAppender = (FileAppender&lt;?&gt;) enumElement; 更改为fileAppender = (FileAppender&lt;ILoggingEvent&gt;) enumElement; 以使其适合我。
  • @danial 会更具体。但如果你想要 2-3 个文件记录器(调试和跟踪),那么这段代码将完美运行。
【解决方案3】:

您可以像这样获取实际文件:

    LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory();

    for (ch.qos.logback.classic.Logger logger : context.getLoggerList()) {
        for (Iterator<Appender<ILoggingEvent>> index = logger.iteratorForAppenders(); index.hasNext();) {
            Appender<ILoggingEvent> appender = index.next();

            if (appender instanceof FileAppender) {
                FileAppender<ILoggingEvent> fa = (FileAppender<ILoggingEvent>)appender;
                ResilientFileOutputStream rfos = (ResilientFileOutputStream)fa.getOutputStream();
                File file = rfos.getFile();

                System.out.println(file.getAbsolutePath());
            }
        }
    }

【讨论】:

    猜你喜欢
    • 2011-12-11
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多