【Java】【log4j2】log4j 2 ~ 入門編 ~

■ はじめに

 AWS/Lambda の Java のロギングについて、調べたところ
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/java-logging.html
~~~~~~~~~
Log4j™ 2 のカスタム Appender
AWS Lambda は、Log4j 2 を使用してカスタム Appender を提供することをお勧めします。。
~~~~~~~~~
とのことだった。

Log4jは、以下の関連記事でも扱ったが、
Log4j 2 について、触ったことなかったので、調べてみた。

Log4j との違い

 * propertiesファイル が使えない
  => XML(log4j2.xml)だけでなく、代わりに(?)、
     YAML(log4j2.yml)、JSON(log4j2.json)が使えるようになった

■ 設定

モジュールを落とす

 * 今回は、Gradle を使う
https://logging.apache.org/log4j/2.x/maven-artifacts.html
build.gradle
dependencies {
    // Log4j 2
    compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.11.0'
    compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.11.0'
    // For AWS
    //compile group: 'com.amazonaws', name: 'aws-lambda-java-log4j2', version: '1.1.0'
}

■ サンプル

log4j2.xml

src/main/resources配下に置く
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="off">
  <Properties>
    <Property name="default_format">%d{yyyy/MM/dd HH:mm:ss.SSS} [%t] %-5level %C{1}:%L - %msg%n</Property>
    <Property name="log_file">C:/temp/sample_log4j.log</Property>
    <Property name="log_file_pattern">C:/temp/sample_log4j%d{yyyy-MM-dd}-%i.log</Property>
  </Properties>
  <appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout>
        <pattern>${default_format}</pattern>
      </PatternLayout>
    </Console>
    <RollingFile name="LogOutput" append="true" fileName="${log_file}"
      filePattern="${log_file_pattern}">
      <PatternLayout>
        <pattern>${default_format}</pattern>
      </PatternLayout>
      <Policies>
        <SizeBasedTriggeringPolicy size="1KB"/>
      </Policies>
      <DefaultRolloverStrategy max="5"/>
    </RollingFile>
  </appenders>
  <loggers>
    <root level="trace">
      <AppenderRef ref="Console" />
      <AppenderRef ref="LogOutput" />
    </root>
  </loggers>
</configuration>

LogDemo.java

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class LogDemo {
  private static final Logger logger = LogManager.getLogger(LogDemo.class);
  
  public static void main(String[] args) {
    logger.trace("!! trace !! {}", "Hello, World");
    logger.debug("!! debug !! {}", "Hello, World");
    logger.info("!! info !! {}", "Hello, World");
    logger.warn("!! warn !! {}", "Hello, World");
    logger.error("!! error !! {}", "Hello, World");
    logger.fatal("!! fatal !! {}", ClassLoader.getSystemResource("log4j2.xml"));
  }
}
出力結果(コンソールと「C:\temp\sample_log4j.log」)
2018-04-16 21:24:01.592 [main] TRACE LogDemo:10 - !! trace !! Hello, World
2018-04-16 21:24:01.596 [main] DEBUG LogDemo:11 - !! debug !! Hello, World
2018-04-16 21:24:01.596 [main] INFO  LogDemo:12 - !! info !! Hello, World
2018-04-16 21:24:01.596 [main] WARN  LogDemo:13 - !! warn !! Hello, World
2018-04-16 21:24:01.596 [main] ERROR LogDemo:14 - !! error !! Hello, World
2018-04-16 21:24:01.596 [main] FATAL LogDemo:15 - !! fatal !! file:/C:/workspace/SampleDemo/bin/log4j2.xml

log4j 2 あれこれ

String.format( %s ) みたいな使い方をしたい

// {} 部分に「Hello, World」が出力される
logger.trace("... {}", "Hello, World");


関連記事

log4j ~入門編~

https://blogs.yahoo.co.jp/dk521123/32020042.html

log4j のローテーションについて

https://blogs.yahoo.co.jp/dk521123/32113555.html

Java で イベントログ を出力するには ~Log4j編~

https://blogs.yahoo.co.jp/dk521123/33210162.html

Java での リソース の扱いについて

https://blogs.yahoo.co.jp/dk521123/37497699.html