ログレベルの設定値を、ログの設定ファイル(log4j2.xml)ではなくソースコードや外部ファイルに持たせたい要求もあったりします。その要求を満たすべく、log4j2.xmlに書いたログレベルをファイル読み込み時に上書きするサンプルを書きました。
下記のようなログファイルを考えます。
log4j2.xml
<Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="debug"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration>
-Dlog4j.configurationFile="file:///C:/xxx/MyProject/src/resources/log4j2.xml"
Loggerの取得前にログレベルを上書きする処理を追加します。Loggerの設定値を読み込んで、引数で指定したLevelでログレベルを更新しています。
MyLogManager.java
package com.jp.test.MyProject; import java.util.Objects; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.core.config.LoggerConfig; public class MyLogManager { /** * 指定したログレベルでLoggerを取得する * @param level * @return */ public static Logger getLogger(Level level) { if (Objects.nonNull(level)) { LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false); Configuration configuration = loggerContext.getConfiguration(); LoggerConfig loggerConfig = configuration.getLoggerConfig(LogManager.ROOT_LOGGER_NAME); loggerConfig.setLevel(level); loggerContext.updateLoggers(); } return LogManager.getLogger(); } }
利用側では、Level.INFO等のログレベルを指定してLoggerを取得します。下記の例では、debugが出力されず、error、warn、infoまでが出力されます。
App.java
package com.jp.test.MyProject; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Logger; public class App { private static Logger logger = MyLogManager.getLogger(Level.INFO); public static void main( String[] args ) { logger.error("error"); logger.warn("warn"); logger.info("info"); logger.debug("debug"); } }