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?
            Asked
            
        
        
            Active
            
        
            Viewed 1.4k times
        
    31
            
            
        
        Community
        
- 1
 - 1
 
        Alexey Romanov
        
- 167,066
 - 35
 - 309
 - 487
 
- 
                    Sorry but I fail to understand the question. Could you expand a bit? – Ceki Aug 15 '11 at 22:50
 - 
                    1@Ceki: more generally, can I get a list of all appenders used by Logback? – Alexey Romanov Aug 16 '11 at 06:54
 
3 Answers
36
            You can get the list of all appenders in a certain context. To do this:
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.
        tafoo85
        
- 869
 - 8
 - 12
 
- 
                    1iteratorForAppenders method doesn't exist any more on logger (http://www.slf4j.org/apidocs/org/slf4j/Logger.html). Any idea how it works now? – user3885927 Jul 26 '16 at 00:13
 - 
                    2@user3885927 make sure you're importing ch.qos.logback.classic.Logger and not org.slf4j.Logger ! – Catchwa Feb 21 '17 at 03:43
 
24
            
            
        Answer given by @tafoo85 is correct one but it will give you appenders only.
To more specific get file used by Logback logger i hope below code will help some one.
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());
        Wasim K. Memon
        
- 5,979
 - 4
 - 40
 - 55
 
- 
                    Was exactly what I needed, though I changed the line `Object enumElement = index.next();` to `Appender
enumElement= index.next();` as well as `fileAppender = (FileAppender>) enumElement;` to `fileAppender = (FileAppender – daniel.kahlenberg Oct 13 '15 at 12:08) enumElement;` to make it work for me.  - 
                    1@danial that will be more specific. but if you want 2-3 file logger (debug and trace) then this code will work perfectly. – Wasim K. Memon Oct 14 '15 at 05:14
 
3
            
            
        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());
            }
        }
    }
        Ray
        
- 1,324
 - 10
 - 18