Log4j2でログ出力
今回はLog4j2を使用してログを出力してみます。環境構築
公式ページよりライブラリをダウンロードします。ダウンロードはこちら →https://logging.apache.org/log4j/2.x/download.html
解凍すると多くのJarが入っていますが、その中の以下をビルドパスに追加します。
- log4j-api-2.17.0.jar
- log4j-core-2.17.0.jar
Eclipseのプロジェクトではこのようになります。
(後でソースとlog4j2.xmlを作成しますが、上記イメージはそれも含めています)
Mavenを使用する場合、pom.xmlは以下のようになります
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>mvnTest</groupId>
<artifactId>mvnTest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.17.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.17.0</version>
</dependency>
</dependencies>
</project>
log4j2.xmlの作成
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration>
<Configuration status="OFF">
<Properties>
<Property name="ptn">%d{yyyy-MM-dd HH:mm:ss.SSS} p=%-5p c=%c t=%t C=%C F=%F M=%M L=%L m=%m %n</Property>
</Properties>
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="${ptn}" />
</Console>
<RollingFile name="file" fileName="log/log4j2.log"
filePattern="log/%d{yyyyMM}/log4j2_%d{yyyyMMdd}_%i.log">
<PatternLayout pattern="${ptn}" />
<Policies>
<OnStartupTriggeringPolicy />
<SizeBasedTriggeringPolicy size="2 MB" />
<TimeBasedTriggeringPolicy />
</Policies>
<DefaultRolloverStrategy max="10" />
</RollingFile>
</Appenders>
<Loggers>
<Root level="all">
<AppenderRef ref="console" />
<AppenderRef ref="file" />
</Root>
</Loggers>
</Configuration>
log4j2.xmlはクラスパスが通っている場所に置きます。わからなかったらsrcフォルダ直下に置いてください(環境構築のイメージ参照)。
log4j2.xmlの中身はConfigurationの中に、Properties、Appenders、Loggersが入ります。
Properties
プロパティを定義します。定義したプロパティは${name}と記述することで使用することができます。Appenders
ログ出力方式、出力内容を定義します。コンソールに出力する場合は、Consoleタブに定義し、ファイルに出力する場合はRollingFileタブに定義します。(ファイルに出力する場合は、FileAppenderなどもありますが、実際の業務ではRollingFileを使うことが多いと思います。)
出力内容はPatternLayoutのpatternで定義します。上記の例ではPropertiesで定義したものを使っています。
記述 | 出力内容 |
---|---|
%d | 日時を出力。{}でフォーマットを指定できる。例:%d{yyyy-MM-dd HH:mm:ss.SSS} |
%p | レベルを出力。%-5pでスペースを後ろに付けた5文字に変換。 |
%c | ロガー名。LogManager.getLoggerで引数で指定したもの。 |
%t | スレッド名。 |
%C | クラス名。※パフォーマンス悪い。 |
%F | ソースファイル名。※パフォーマンス悪い。 |
%M | メソッド名。※パフォーマンス悪い。 |
%L | 行。※パフォーマンス悪い。 |
%l | %C.%M(%F:%L)を出力。※パフォーマンス悪い。 |
%m | 指定した出力メッセージ。 |
%n | 改行 |
%i | ファイルのシーケンス |
targetにはSYSTEM_OUT、SYSTEM_ERR のどちらかを指定します。
記述 | 処理 |
---|---|
SYSTEM_OUT | System.out |
SYSTEM_ERR | System.err |
fileNameにはログ出力先のファイル、filePatternには古くなったログファイルの名称変更先を指定します。
フルパスも指定できます。相対パスで出力した場合、作業フォルダに出力されます。
作業フォルダがわからない場合、System.getProperty("user.dir")で確認できます。
Policies
古くなったログファイルの名称変更し新しいログを作成するタイミングを指定します。
タグ | 説明 |
---|---|
OnStartupTriggeringPolicy | 起動時に新しいログ作成。 |
SizeBasedTriggeringPolicy | ログが指定サイズを超えたときに新しいログ作成。 |
TimeBasedTriggeringPolicy | 指定時間が経過したときに新しいログ作成。 |
TimeBasedTriggeringPolicyはfilePatternで指定した時間単位が変更となると新しいログを作成します。
filePattern="log4j2_%d{yyyyMMddHHmm}_%i.log"とすると分単位にログが新しくなります。
5分単位にする場合、上記のfilePatternで以下のようにします。
<TimeBasedTriggeringPolicy interval="5" modulate="true" />
DefaultRolloverStrategy はfilePatternに%i(インデックス)を指定してインデックス違いの古いログをどのように管理するか定義します。
maxには古いログの保持数を設定します。
Loggers
ログをどの処理でどのAppendersを使って出力するかを指定します。packageごとに指定できますが、Rootを指定すると全パッケージ分が出力されます。packageごとに指定する場合、以下のようにnameにJavaのパッケージを指定します。additivityをfalseにするとRootで同じログが出力されない設定になります。
<Loggers>
<Logger name="javaTest2" level="debug" additivity="false">
<AppenderRef ref="file"/>
</Logger>
<Root level="all">
<AppenderRef ref="console" />
</Root>
</Loggers>
Javaファイルにログ出力処理の埋め込み
package javaTest2;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Test {
static Logger logger = LogManager.getLogger(Test.class);
public static void main(String[] args) {
// RollingFileで相対パスを指定した場合、作業フォルダからの相対パスになる
System.out.println("作業フォルダ:" + System.getProperty("user.dir"));
logger.trace("_trace");
logger.debug("_debug");
logger.info("_info");
logger.warn("_warn");
logger.error("_error");
logger.fatal("_fatal");
try {
String str = null;
str.length();
} catch (Exception e) {
logger.error("_error2", e);
}
}
}
trace、debug、info、warn、error、fatalのメソッドでログを出力する。メソッド名が出力レベルになる。
log4j2.xmlのlevel属性で出力するログを制限できる。
処理結果
作業フォルダ:C:\eclipseee\workspace\javaTest2
2021-12-27 22:47:02.533 p=TRACE c=javaTest2.Test t=main C=javaTest2.Test F=Test.java M=main L=14 m=_trace
2021-12-27 22:47:02.536 p=DEBUG c=javaTest2.Test t=main C=javaTest2.Test F=Test.java M=main L=15 m=_debug
2021-12-27 22:47:02.536 p=INFO c=javaTest2.Test t=main C=javaTest2.Test F=Test.java M=main L=16 m=_info
2021-12-27 22:47:02.536 p=WARN c=javaTest2.Test t=main C=javaTest2.Test F=Test.java M=main L=17 m=_warn
2021-12-27 22:47:02.536 p=ERROR c=javaTest2.Test t=main C=javaTest2.Test F=Test.java M=main L=18 m=_error
2021-12-27 22:47:02.537 p=FATAL c=javaTest2.Test t=main C=javaTest2.Test F=Test.java M=main L=19 m=_fatal
2021-12-27 22:47:02.537 p=ERROR c=javaTest2.Test t=main C=javaTest2.Test F=Test.java M=main L=24 m=_error2
java.lang.NullPointerException: Cannot invoke "String.length()" because "str" is null
at javaTest2.Test.main(Test.java:22) [bin/:?]
ページのトップへ戻る