2011-08-15 20 views
24

ログファイルをサポート電子メールに自動的に添付すると便利です。私はプログラム的にパスを設定することができます(Setting Logback Appender path programmatically)が、私はユーザがlogback.xml経由でよく知られた方法でロギングを設定できるようにしたいと考えています。では、ロギングにログバックを使用するファイルを見つけることはできますか?ログバックログファイルをプログラムで見つけることはできますか?

+0

申し訳ありませんが、私は質問を理解できません。少し拡大できますか? – Ceki

+1

@Ceki:より一般的には、Logbackで使用されるすべてのアペンダーのリストを取得できますか? –

答えて

28

特定のコンテキストですべてのアペンダーのリストを取得できます。これを行うには:

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メソッドは、ロガーではもう存在しません(http://www.slf4j.org/apidocs/org/slf4j/Logger.html)。どのように今、どのような考えですか? – user3885927

+0

@ user3885927 org.slf4j.Loggerではなくch.qos.logback.classic.Loggerをインポートしていることを確認してください! – Catchwa

17

@ 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()); 
+0

'fileEntryElement = index.next();'行を 'Appender enumElement = index.next();'と 'fileAppender =(FileAppender )enumElementに変更しましたが、 'to' 'fileAppender =(FileAppender )enumElement;'は私のために働かせます。 –

+1

@ダニアルは、より具体的になります。 2-3ファイルロガー(デバッグとトレース)が必要な場合、このコードは完全に機能します。 – androidnoobdev

関連する問題