トッカンソフトウェア

Log4j2でログ出力

今回はLog4j2を使用してログを出力してみます。


環境構築

公式ページよりライブラリをダウンロードします。
ダウンロードはこちら →https://logging.apache.org/log4j/2.x/download.html

解凍すると多くの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/:?]

			
ページのトップへ戻る