Log4j 2を使ったプログラムによる設定
1前書き
このチュートリアルでは、Apache Log4j 2をプログラムで設定するさまざまな方法を見ていきます。
2初期設定
Log4j 2を使い始めるためには、https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.apache.logging.log4j%22%20AND%20a%3Aを含めるだけでよい%22log4j-core%22[log4j-core]およびhttps://search.maven.org/classic/#search%7C1%7Cg%3A%22org.apache.logging.log4j%22%20AND%20a%3A %22log4j-slf4j-impl%22[log4j-slf4j-impl]依存関係は
pom.xml
にあります。
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.11.0</version>
</dependency>
3
ConfigurationBuilder
Mavenを設定したら、
ConfigurationBuilder
を作成する必要があります。これは、
appenders、filters、layout、
、および
loggers.
を設定できるクラスです。
Log4j 2は
ConfigurationBuilder
を取得するいくつかの方法を提供します。
最も直接的な方法から始めましょう。
ConfigurationBuilder<BuiltConfiguration> builder
= ConfigurationBuilderFactory.newConfigurationBuilder();
そして、コンポーネントの設定を開始するために、
ConfigurationBuilder
には、コンポーネントごとに
__newAppender
または
newLayout
などの対応する
new__メソッドが用意されています。
FileAppender
や__ConsoleAppenderのように、一部のコンポーネントには異なるサブタイプがあります。
3.1. アペンダの設定
appender
を設定することによって
builder
に各ログ行をどこに送るかを伝えましょう:
AppenderComponentBuilder console
= builder.newAppender("stdout", "Console");
builder.add(console);
AppenderComponentBuilder file
= builder.newAppender("log", "File");
file.addAttribute("fileName", "target/logging.log");
builder.add(file);
ほとんどの
new
メソッドはこれをサポートしていませんが、
newAppender(name、plugin)
ではアペンダに名前を付けることができます。これは後で重要になるでしょう。これらのアペンダは、私たちは
stdout
と____logと呼んでいます。
また、
builder
にどのアペンダ
plugin
(より簡単にはどの種類のアペンダ)を使用するかを伝えました。
Console
と
File
は、それぞれ標準出力とファイルシステムに書き込むためのLog4j 2のアペンダを参照します。
Log4j 2は複数のアペンダをサポートしています
、
__AppenderComponentBuilder
__はすべてのアペンダタイプのための一般的なクラスなので、Javaを使用してそれらを設定することは少しトリッキーかもしれません。
これにより、
setFileName
および
addTriggeringPolicy
の代わりに
addAttribute
および____addComponentのようなメソッドが作成されます。
AppenderComponentBuilder rollingFile
= builder.newAppender("rolling", "RollingFile");
rollingFile.addAttribute("fileName", "rolling.log");
rollingFile.addAttribute("filePattern", "rolling-%d{MM-dd-yy}.log.gz");
rollingFile.addComponent(triggeringPolicies);
builder.add(rollingFile);
そして最後に、メインの設定に追加するために
builder.add
を呼び出すことを忘れないでください。
3.2. フィルタの設定
各ログ行に追加するかどうかを決定するフィルタを各アペンダに追加できます。
コンソールアペンダに
MarkerFilter
プラグインを使用しましょう。
FilterComponentBuilder flow = builder.newFilter(
"MarkerFilter",
Filter.Result.ACCEPT,
Filter.Result.DENY);
flow.addAttribute("marker", "FLOW");
console.add(flow);
この
new
メソッドではフィルタに名前を付けることはできませんが、フィルタが成功または失敗した場合の対処方法を指定するように求められます。
この場合、
MarkerFilter
が通過した場合はログラインを
ACCEPT
とすることを明記して、単純にしました。それ以外の場合は
__DENY
__itです。
-
この場合、
builder
には追加しないで、代わりにこのフィルタを使用するアペンダに追加します。**
3.3. レイアウトを設定する
次に、各ログ行のレイアウトを定義しましょう。この場合は、
PatternLayout
プラグインを使用します。
LayoutComponentBuilder standard
= builder.newLayout("PatternLayout");
standard.addAttribute("pattern", "%d[%t]%-5level: %msg%n%throwable");
console.add(standard);
file.add(standard);
rolling.add(standard);
繰り返しますが、
builder
ではなく、適切なアペンダにこれらを直接追加しました。
** 3.4. ルートロガーの設定
ログの送信先がわかったので、どのログを各宛先に送信するかを構成します。
ルートロガーは、最も高いロガーで、Javaの
Object
のようなものです。
このロガーは、上書きされない限りデフォルトで使用されるものです。
それでは、デフォルトのロギングレベルを
ERROR
に設定し、デフォルトのアペンダを上の
stdout
アペンダに設定するために、ルートロガーを使用しましょう。
RootLoggerComponentBuilder rootLogger
= builder.newRootLogger(Level.ERROR);
rootLogger.add(builder.newAppenderRef("stdout"));
builder.add(rootLogger);
ロガーを特定のアペンダーに向けるために、ビルダーのインスタンスをそれに与えないでください。代わりに、** 先ほど与えた
name
によってそれを参照します。
3.5. 追加ロガーの設定
子ロガーは特定のパッケージまたはロガー名をターゲットにするために使用できます。
アプリケーションに
com
パッケージのロガーを追加し、ロギングレベルを
DEBUG
に設定して、それらを私たちの
__log
__appenderに移動させます。
LoggerComponentBuilder logger = builder.newLogger("com", Level.DEBUG);
logger.add(builder.newAppenderRef("log"));
logger.addAttribute("additivity", false);
builder.add(logger);
__additivity
__をロガーで設定できることに注意してください。これは、このロガーがその祖先からログ記録レベルやアペンダタイプなどのプロパティを継承するかどうかを示します。
3.6. 他のコンポーネントの設定
すべてのコンポーネントが
ConfigurationBuilder
に専用の
new
メソッドを持っているわけではありません。
そのため、その場合は
newComponent.
を呼び出します。
たとえば、
TriggeringPolicyComponentBuilder
がないため、ローリングファイルアペンダのトリガポリシーを指定するなどの目的で
__newComponent
__を使用する必要があります。
ComponentBuilder triggeringPolicies = builder.newComponent("Policies")
.addComponent(builder.newComponent("CronTriggeringPolicy")
.addAttribute("schedule", "0 0 0 ** ** ?"))
.addComponent(builder.newComponent("SizeBasedTriggeringPolicy")
.addAttribute("size", "100M"));
rolling.addComponent(triggeringPolicies);
3.7. 同等のXML
____ConfigurationBuilderは、同等のXMLを出力するための便利なメソッドを備えています。
builder.writeXMLConfiguration(System.out);
上記の行を実行すると出力されます。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="stdout">
<PatternLayout pattern="%d[%t]%-5level: %msg%n%throwable"/>
<MarkerFilter onMatch="ACCEPT" onMisMatch="DENY" marker="FLOW"/>
</Console>
<RollingFile name="rolling"
fileName="target/rolling.log"
filePattern="target/archive/rolling-%d{MM-dd-yy}.log.gz">
<PatternLayout pattern="%d[%t]%-5level: %msg%n%throwable"/>
<Policies>
<CronTriggeringPolicy schedule="0 0 0 ** ** ?"/>
<SizeBasedTriggeringPolicy size="100M"/>
</Policies>
</RollingFile>
<File name="FileSystem" fileName="target/logging.log">
<PatternLayout pattern="%d[%t]%-5level: %msg%n%throwable"/>
</File>
</Appenders>
<Loggers>
<Logger name="com" level="DEBUG" additivity="false">
<AppenderRef ref="log"/>
</Logger>
<Root level="ERROR" additivity="true">
<AppenderRef ref="stdout"/>
</Root>
</Loggers>
</Configuration>
これは、設定を再確認したい場合や、設定をファイルシステムなどに保持したい場合に便利です。
3.8. すべてを一緒に入れて
これで完全に設定されたので、Log4j 2に設定を使用するように伝えましょう。
Configurator.initialize(builder.build());
これが呼び出された後、
将来のLog4j 2の呼び出しは
私たちの設定を使用します。
-
これは
LogManager.getLogger
を呼び出す前に
Configurator.initialize
を呼び出す必要があることを意味します
4
ConfigurationFactory
ConfigurationBuilder
を取得して適用する方法が1つ見られたので、もう一度見てみましょう。
public class CustomConfigFactory
extends ConfigurationFactory {
public Configuration createConfiguration(
LoggerContext context,
ConfigurationSource src) {
ConfigurationBuilder<BuiltConfiguration> builder = super
.newConfigurationBuilder();
//... configure appenders, filters, etc.
return builder.build();
}
public String[]getSupportedTypes() {
return new String[]{ "** " };
}
}
この場合、
ConfigurationBuilderFactory
を使用する代わりに、
Configuration
のインスタンスを作成するためのターゲットクラスである
ConfigurationFactory
をサブクラス化しました。
それから、最初に行ったように
Configurator.initialize
を呼び出すのではなく、Log4j 2に新しい設定ファクトリについて知らせる必要があります。
これを行うには3つの方法があります。
-
静的初期化
-
ランタイムプロパティ、または
-
__ @プラグイン
__annotation
4.1. 静的初期化を使用する
Log4j 2は、静的初期化中の____setConfigurationFactoryの呼び出しをサポートしています。
static {
ConfigurationFactory custom = new CustomConfigFactory();
ConfigurationFactory.setConfigurationFactory(custom);
}
このアプローチには、最後に見たアプローチと同じ制限があります。つまり、
LogManager.getLogger
__.
__を呼び出す前に
呼び出す必要があります。
4.2. ランタイムプロパティを使用する
Java起動コマンドにアクセスできる場合、Log4j 2は
-D
パラメータを介して使用する
__ConfigurationFactory
__の指定もサポートします。
-Dlog4j2.configurationFactory=com.baeldung.log4j2.CustomConfigFactory
-
この方法の主な利点は、最初の2つの方法と同じように初期化の順序を気にする必要がないということです。
4.3.
__ @プラグインを使用する
__注釈
そして最後に、
-D
を追加してJavaの起動コマンドをいじりたくない場合は、Log4j 2
__ @ Plugin
アノテーションを使って
CustomConfigurationFactory__に単に注釈を付けることができます。
@Plugin(
name = "CustomConfigurationFactory",
category = ConfigurationFactory.CATEGORY)
@Order(50)
public class CustomConfigFactory
extends ConfigurationFactory {
//... rest of implementation
}
Log4j 2は
__ @ Plugin
アノテーションを持つクラスのクラスパスをスキャンし、
ConfigurationFactory
__カテゴリでこのクラスを見つけるとそれを使用します。
4.4. 静的構成との組み合わせ
ConfigurationFactory
拡張を使用するもう1つの利点は、カスタム設定をXMLなどの他の設定ソースと簡単に組み合わせることができることです。
public Configuration createConfiguration(
LoggerContext context,
ConfigurationSource src) {
return new WithXmlConfiguration(context, src);
}
source
パラメーターは、Log4j 2が検出した静的XMLまたはJSON構成ファイルを表します。
私たちはその設定ファイルを持ってきてそれを
XmlConfiguration
の私たちのカスタム実装に送ることができます。
public class WithXmlConfiguration extends XmlConfiguration {
@Override
protected void doConfigure() {
super.doConfigure();//parse xml document
//... add our custom configuration
}
}
5結論
この記事では、Log4j 2で利用可能な新しい
ConfigurationBuilder
APIの使い方を調べました。
より高度なユースケースのために、
__ConfigurationBuilderと組み合わせて
__ConfigurationFactoryをカスタマイズすることも見ました。
私の完全な例をチェックアウトすることを忘れないでください。