【Java】log4jを利用する

  • log4jの取得
    Javaでlog4jを利用します。
    log4jも1.xと2.xでバージョンがありますが
    2015年8月で1.xの開発は終わっており、
    今は2.xの利用が推奨されています。

    log4j2.xの最新版は以下のサイトの(binary (zip))から入手します。
    http://logging.apache.org/log4j/2.x/download.html

    zipファイルを解凍後、以下のjarをクラスパスに通します。
    log4j-api-2.x.jarとlog4j-core-2.x.jar

  • log4jの設定ファイル
    log4j1.xではlog4j.propertiesだったようですが、
    log4j2.xではlog4j.xmlを利用します。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE project>  
    <Configuration status="off">
    
    <Properties>
        <Property name="format1">%d{yyyy/MM/dd HH:mm:ss.SSS} [%t] [%p] [%c] %m%n</Property>
        <Property name="logfile">D:/test.log</Property>
        <Property name="logfile-archive">D:/test_%d{yyyy-MM-dd}-%i.log</Property>
        <!-- %dは日時。{}に日時の形式を指定 -->
        <!-- %tはスレッド名 -->
        <!-- %pはログレベル名(TRACE, ERROR) -->
        <!-- %cはロガーを生成したクラスフルパス -->
        <!-- %mはログメッセージ -->
        <!-- %nは改行 -->
        <!-- 出力イメージ
             2017/06/25 14:54:20.068 [pool-1-thread-1] [TRACE] [thread.Log] 10:処理開始
             2017/06/25 14:54:20.070 [pool-1-thread-1] [TRACE] [thread.Log] 10:処理終了
        -->
    </Properties>
    
    <Appenders>
        <!-- コンソール出力設定 -->
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout>
                <pattern>${format1}</pattern>
            </PatternLayout>
        </Console>
    
        <!-- ファイル出力設定 -->
        <RollingFile name="logfile001" append="true" fileName="${logfile}" filePattern="${logfile-archive}">
            <PatternLayout>
                <pattern>${format1}</pattern>
            </PatternLayout>
            <Policies>
                <!-- 1KBを超えたらローテーション -->
                <SizeBasedTriggeringPolicy size="1KB"/>
                <!-- 日付でローテーション -->
                <TimeBasedTriggeringPolicy />
            </Policies>
            <!-- ローテーションファイルの圧縮率や削除タイミング -->
            <DefaultRolloverStrategy max="3"/>
        </RollingFile>
    </Appenders>
    
    <Loggers>
        <!-- nameは任意の名前かパッケージ名(hoge.fuga.sample)を指定する -->
        <!-- 任意の名前の場合、JavaでLoggerを生成する際にコンストラクタで指定する -->
        <!-- additivityは上位のロガーにもログを出力するかどうか。デフォルトはtrue -->
        <Logger name="WEB" level="info" additivity="false">
            <AppenderRef ref="logfile001" />
        </Logger>
        <Root level="trace">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
    
    </Configuration>
    
  • log4jの利用

    package thread;
    public class Log {
    
        private Logger logger = null;
        private massage = "";
    
        public Log() {
            logger = LogManager.getLogger();
        }
    
        public void writeInfoLog(String message) {
            // messageIDを引数として、メッセージ内容を取得する方法が良い。
            logger.trace(Thread.currentThread().getId() + ":" + message);
        }
    }
    
    package thread;
    public class CallableTest implements Callable<Integer> {
    
        private Log logger = new Log();
        private Log loggerWeb = new Log("WEB");
    
        public Integer call() throws Exception {
            logger.writeInfoLog("ログ");
            loggerWeb.writeInfoLog("ログ");
        }
    }