java 是否可以以编程方式查找 logback 日志文件?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/7064402/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 18:30:29  来源:igfitidea点击:

Is it possible to find logback log files programmatically?

javalogginglogback

提问by Alexey Romanov

It would be useful to automatically attach log files to support emails. I could set the path programmatically (as in Setting Logback Appender path programmatically), but I'd prefer to let users configure logging in the familiar way via logback.xml. So, can I find the files logback uses for logging?

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

回答by tafoo85

You can get the list of all appenders in a certain context. To do this:

您可以获取特定上下文中所有 appender 的列表。去做这个:

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

This iterates over the list of all appenders in all loggers for the current context.

这将迭代当前上下文的所有记录器中所有附加程序的列表。

回答by Wasim K. Memon

Answer given by @tafoo85 is correct one but it will give you appenders only.

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

To more specific get file used by Logback logger i hope below code will help some one.

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

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

回答by Ray

You can get the actual file like so:

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

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