2011-08-15 28 views
24

自動附加日誌文件以支持電子郵件會很有用。我可以通過程序設置路徑(如Setting Logback Appender path programmatically),但我更願意讓用戶通過logback.xml以熟悉的方式配置日誌記錄。那麼,我可以找到logback用於記錄日誌的文件嗎?是否有可能以編程方式查找logback日誌文件?

+0

對不起,但我不明白這個問題。你能擴展一下嗎? – Ceki

+1

@Ceki:更一般地說,我可以得到Logback使用的所有appender列表嗎? –

回答

28

您可以在特定的上下文中獲取所有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(); 
     } 
    } 

這遍歷當前上下文的所有記錄器中的所有appender的列表。

+1

iteratorForAppenders方法在logger(http://www.slf4j.org/apidocs/org/slf4j/Logger.html)上不再存在。任何想法現在如何工作? – user3885927

+0

@ user3885927確保你正在導入ch.qos.logback.classic.Logger而不是org.slf4j.Logger! – Catchwa

17

@ tafoo85給出的答案是正確的,但它只會給你appender。

要更具體地獲取文件使用的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()); 
+0

正是我所需要的,儘管我將'Object enumElement = index.next();'改成了'Appender enumElement = index.next();'以及'fileAppender =(FileAppender )enumElement; 'to'fileAppender =(FileAppender )enumElement;'使它適用於我。 –

+1

@danial將更具體。但如果你想要2-3檔案記錄器(調試和跟蹤),那麼這段代碼將完美工作。 – androidnoobdev

相關問題