能否通过编程方式找到logback日志文件?

31

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


抱歉,我无法理解您的问题。您能否详细说明一下? - Ceki
1
@Ceki:更普遍地说,我能否获得Logback使用的所有附加器列表? - Alexey Romanov
3个回答

36

您可以获取特定上下文中所有附加程序的列表。要做到这一点:

LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory();
for (Logger logger : context.getLoggerList()) {
        for (Iterator<Appender<ILoggingEvent>> index = logger.iteratorForAppenders(); index.hasNext();) {
            Appender<ILoggingEvent> appender = index.next();
        }
    }
这个循环遍历当前上下文中所有记录器的所有附加程序列表。

1
iteratorForAppenders方法在logger上已经不存在了(http://www.slf4j.org/apidocs/org/slf4j/Logger.html)。你有什么想法它现在是如何工作的吗? - user3885927
2
@user3885927 请确保导入的是 ch.qos.logback.classic.Logger 而不是 org.slf4j.Logger! - Catchwa

24

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

更具体地说,要获取Logback Logger使用的文件,我希望下面的代码能帮助一些人。

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<ILoggingEvent> enumElement= index.next(); 以及 fileAppender = (FileAppender<?>) enumElement; 更改为 fileAppender = (FileAppender<ILoggingEvent>) enumElement; 使其适用于我的需求。 - daniel.kahlenberg
1
@danial 那会更具体一些。但是如果你想要2-3个文件记录器(调试和跟踪),那么这段代码将完美地工作。 - Wasim K. Memon

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

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