logback-classic-1.4.x.jar から、
ch.qos.logback.classic.LoggerContext
を取得して、ch.qos.logback.classic.Logger を求めて、Appender<ILoggingEvent> のイテレータで
設定された各アペンダを参照、RollingFileAppender<ILoggingEvent< で cast して
ローテーション・ファイルアペンダの状況を以下の様に参照することができる。
LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory(); for(ch.qos.logback.classic.Logger clogger : context.getLoggerList()) { for(Iterator<Appender<ILoggingEvent>> itr = clogger.iteratorForAppenders(); itr.hasNext();) { Appender<ILoggingEvent> apd = itr.next(); if (apd instanceof RollingFileAppender<ILoggingEvent> ra) { System.out.println("appender-ref(アペンダリファレンス) = "+ apd.getName() ); System.out.println("target package(対象パッケージ) = "+ clogger.getName() ); System.out.println("File(ログファイル出力) = "+ ra.getFile() ); } } }
上記の if (apd instanceof RollingFileAppender<ILoggingEvent> ra)は、
Java16 からのJEP 394: Pattern Matching for instanceof の書き方で書いています。
logback.xml に以下を記述した場合
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>/var/log/test.log</File> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>/var/log/test.%d{yyyy-MM-dd}.log</FileNamePattern> <maxHistory>12</maxHistory> </rollingPolicy> <encoder> <charset>UTF-8</charset> <Pattern>%-23d{yyyy/MM/dd HH:mm:ss.SSS} %-5p [%thread][%class#%method:%line]%m%n</Pattern> </encoder> </appender> <logger name="aaa.bbb.ccc"> <level value="debug" /> <appender-ref ref="STDOUT" /> <appender-ref ref="FILE" /> </logger>
以下の標準出力結果になる。
appender-ref(アペンダリファレンス) = FILE target package(対象パッケージ) = aaa.bbb.ccc File(ログファイル出力) = /var/log/test.log
ここで、 <File>/var/log/test.log</File> を削除していていれば、
<appender> の中で書いた <rollingPolicy> の中の <FileNamePattern> の
ファイルパスをFile(ログファイル出力)として、上記であれば、現在日付のファイル名で
取得することになる。
logback.xml で書いているログ出力ファイルPath だけを取得するメソッドにするなら、
参照アペンダ名と、対象クラスを指定する以下のメソッドを用意すれば良い。
public static String logfile(String appenderRefer, Class<?> cls) { String pkgName = cls.getPackage().getName(); LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory(); for(ch.qos.logback.classic.Logger clogger : context.getLoggerList()) { if (pkgName.startsWith(clogger.getName())) { for(Iterator<Appender<ILoggingEvent>> itr = clogger.iteratorForAppenders(); itr.hasNext();) { Appender<ILoggingEvent> apd = itr.next(); if (apd instanceof RollingFileAppender<ILoggingEvent> ra) { if (appenderRefer.equals(apd.getName())) { return ra.getFile(); } } } } } return null; }
return null; は、
throw new RuntimeException("logback.xml でファイル出力アペンダが見つかりません。");
でも良いのかもしれない。