Можно ли программно найти файлы журналов регистрации? - PullRequest
29 голосов
/ 15 августа 2011

Было бы полезно автоматически прикреплять файлы журналов для поддержки электронных писем. Я мог бы установить путь программно (как в Установка пути Logback Appender программно ), но я бы предпочел позволить пользователям настраивать ведение журнала знакомым способом через logback.xml. Итак, я могу найти файлы, которые logback использует для регистрации?

Ответы [ 3 ]

31 голосов
/ 24 августа 2011

Вы можете получить список всех дополнений в определенном контексте.Чтобы сделать это:

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

Это перебирает список всех добавителей во всех регистраторах для текущего контекста.

19 голосов
/ 07 августа 2015

Ответ, данный @ 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());
2 голосов
/ 25 мая 2018

Вы можете получить фактический файл так:

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