電子メールをサポートするためにログファイルを自動的に添付すると便利です。プログラムでパスを設定することもできますが( Logback Appenderパスをプログラムで設定する のように)、ユーザーがlogback.xml
を使用して使い慣れた方法でログを構成できるようにしたいと思います。それで、logbackがロギングに使用するファイルを見つけることができますか?
特定のコンテキストですべてのアペンダーのリストを取得できます。これをする:
LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory();
for (Logger logger : context.getLoggerList()) {
for (Iterator<Appender<ILoggingEvent>> index = logger.iteratorForAppenders(); index.hasNext();) {
Appender<ILoggingEvent> appender = index.next();
}
}
これは、現在のコンテキストのすべてのロガー内のすべてのアペンダーのリストを繰り返し処理します。
@ 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());
次のように実際のファイルを取得できます。
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());
}
}
}