log4j2 のログファイル出力設定をプログラム処理から参照する。

先日の logbackのログファイル出力設定をプログラム処理から参照する。 - Oboe吹きプログラマの黙示録
と同様に、log4j2 においてログファイル出力設定をプログラム処理から参照する。
ログ設定のサンプル

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="off">
  <Properties>
    <Property name="format1">[%d{yyyy-MM-dd HH:mm:ss.SSS}],[%-5p],[%c#%M]-%L, %m%n</Property>
  </Properties>
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout>
        <pattern>${format1}</pattern>
      </PatternLayout>
    </Console>
  <RollingFile name="File" fileName="/var/log/sample.log" filePattern="/var/log/sample.%d{yyyy-MM-dd}.log">
      <PatternLayout>
         <pattern>${format1}</pattern>
      </PatternLayout>
      <TimeBasedTriggeringPolicy interval="7" modulate="true" />
    </RollingFile>
  </Appenders>
  
  <Loggers>
    <Root level="DEBUG">
      <AppenderRef ref="Console" level="INFO"/>
    </Root>
    <Logger name="org.sample" level="DEBUG">
       <AppenderRef ref="File"/>
    </Logger>
  </Loggers>
</Configuration>

org.apache.logging.log4j.LogManager を使って、"loggerNameFromXMLConfig" で、
org.apache.logging.log4j.Logger を割り出し、それを
org.apache.logging.log4j.core.Logger に cast して、
org.apache.logging.log4j.core.LoggerContext を取得して
org.apache.logging.log4j.core.Appender のリストを求めて
org.apache.logging.log4j.core.appender.RollingFileAppender を探してようやく
ファイル出力アペンダに辿り着く。

org.apache.logging.log4j.Logger logger  = org.apache.logging.log4j.LogManager.getLogger("loggerNameFromXMLConfig");
org.apache.logging.log4j.core.Logger coreLogger  = (org.apache.logging.log4j.core.Logger)logger;
org.apache.logging.log4j.core.LoggerContext context = (org.apache.logging.log4j.core.LoggerContext)coreLogger.getContext();
context.getConfiguration().getAppenders().values().stream().filter(e->e instanceof org.apache.logging.log4j.core.appender.RollingFileAppender)
.map(e->org.apache.logging.log4j.core.appender.RollingFileAppender.class.cast(e))
.forEach(appender->{
     System.out.println("name : " + appender.getName());
     System.out.println("File : " + appender.getFileName());
     System.out.println("FilePattern : " + appender.getFilePattern());
});

logback の場合と設定ファイルの書き方ルールが違うからロガーに対するアペンダの
設定情報という取得ではない。
上のサンプルの標準出力結果は、

name : File
File : /var/log/sample.log
FilePattern : /var/log/sample.%d{yyyy-MM-dd}.log||<

<RollingFile name="File" の "File" を指定してログ出力ファイルパスを取得するなら、
次のメソッドを用意することになる

public static String logfile(String refName) {
     org.apache.logging.log4j.Logger logger  = org.apache.logging.log4j.LogManager.getLogger("loggerNameFromXMLConfig");
     org.apache.logging.log4j.core.Logger coreLogger  = (org.apache.logging.log4j.core.Logger)logger;
     org.apache.logging.log4j.core.LoggerContext context = (org.apache.logging.log4j.core.LoggerContext)coreLogger.getContext();
     return context.getConfiguration().getAppenders().values().stream().filter(e->e instanceof org.apache.logging.log4j.core.appender.RollingFileAppender)
     .map(e->org.apache.logging.log4j.core.appender.RollingFileAppender.class.cast(e))
     .filter(e->e.getName().equals(refName))
     .map(org.apache.logging.log4j.core.appender.RollingFileAppender::getFileName)
     .findAny().orElseThrow(()->new RuntimeException("not configration RollingFile"));
}