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をカスタマイズすることも見ました。

私の完全な例をチェックアウトすることを忘れないでください。