先日の 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")); }