1. 概要

このチュートリアルでは、警告「log4j:警告ロガーのアペンダーが見つかりませんでした」を修正する方法を示します。アペンダーとは何かとその方法を説明しますそれを定義します。 さらに、さまざまな方法で警告を解決する方法を示します。

2. アペンダーの定義

まず、アペンダーとは何かを説明しましょう。 Log4j を使用すると、ログを複数の宛先に配置できます。 出力を出力する各宛先はアペンダーと呼ばれます。 コンソール、ファイル、JMS、GUIコンポーネントなどのアペンダーがあります。

log4jで定義されたデフォルトのアペンダーはありません。さらに、ロガーは複数のアペンダーを持つことができます。この場合、ロガーはすべてのアペンダーに出力を出力します。

3. 警告メッセージの説明

アペンダーとは何かがわかったので、目前の問題を理解しましょう。 警告メッセージは、ロガーのアペンダーが見つからなかったことを示しています。

警告を再現するために、NoAppenderExampleクラスを作成してみましょう。

public class NoAppenderExample {
    private final static Logger logger = Logger.getLogger(NoAppenderExample.class);

    public static void main(String[] args) {
        logger.info("Info log message");
    }
}

log4jを構成せずにクラスを実行します。 この後、コンソール出力に警告と詳細が表示されます。

log4j:WARN No appenders could be found for logger (com.baeldung.log4j.NoAppenderExample).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

4. 構成に関する問題の解決

Log4jは、デフォルトで、アプリケーションのリソースを調べて構成ファイルを探します。これは、XMLまたはJavaプロパティ形式のいずれかです。 次に、resourcesディレクトリの下にあるlog4j.xmlファイルを定義しましょう。

<log4j:configuration debug="false">
    <!--Console appender -->
    <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %p %m%n"/>
        </layout>
    </appender>

    <root>
        <level value="DEBUG"/>
        <appender-ref ref="stdout"/>
    </root>
</log4j:configuration>

ロガーの階層の最上位に存在するルートロガーを定義しました。 すべてのアプリケーションロガーはその子であり、その構成をオーバーライドします。 root ロガーを1つのアペンダーで定義しました。これにより、ログがコンソールに配置されます。

NoAppenderExample クラスを再度実行して、コンソール出力を確認してみましょう。 その結果、ログには次のステートメントが含まれます。

2021-05-23 12:59:10 INFO Info log message

4.1. アペンダーの相加性

ロガーごとにアペンダーを定義する必要はありません。 特定のロガーのロギング要求は、そのロガーに定義されたアペンダーと、階層の上位のロガーに指定されたすべてのアペンダーにログを送信します。 例で示しましょう。

ロガーAがコンソールアペンダーを定義し、ロガーBAの子である場合、ロガーBはログをコンソールに出力します。それも。 ロガーは、中間の祖先の加法フラグがtrueに設定されている場合にのみ、祖先からアペンダーを継承します。加法フラグが false に設定されている場合、階層の上位のロガーからのアペンダーは継承されません。

logger が祖先からアペンダーを継承していることを証明するために、log4j.xmlファイルにNoAppenderExampleloggerを追加しましょう。

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration debug="false">
    ...
    <logger name="com.baeldung.log4j.NoAppenderExample" />
    ...
</log4j:configuration>

NoAppenderExampleクラスをもう一度実行してみましょう。 今回は、ログステートメントがコンソールに表示されます。 NoAppenderExampleロガーには明示的に定義されたアペンダーはありませんが、ルートロガーからアペンダーを継承します。

5. クラスパスにない構成ファイル

ここで、アプリケーションのクラスパスの外部で構成ファイルを定義する場合を考えてみましょう。 2つのオプションがあります。

  • でファイルへのパスを指定します java コマンドラインオプション: -Dlog4j.configuration =
  • コードでパスを定義します。 PropertyConfigurator.configure(“ ”);

次のセクションでは、Javaコードでこれを実現する方法を説明します。

6. コードで問題を解決する

構成ファイルが必要ないとしましょう。 log4.xml ファイルを削除し、mainメソッドを変更してみましょう。

public class NoAppenderExample {
    private final static Logger logger = Logger.getLogger(NoAppenderExample.class);

    public static void main(String[] args) {
        BasicConfigurator.configure();
        logger.info("Info log message");
    }
}

BasicConfiguratorクラスから静的configureメソッドを呼び出します。 ConsoleAppenderルートロガーに追加します。 configureメソッドのソースコードを見てみましょう。

public static void configure() {
    Logger root = Logger.getRootLogger();
    root.addAppender(new ConsoleAppender(new PatternLayout("%r [%t] %p %c %x - %m%n")));
}

log4jのrootロガーは常に存在するため、プログラムでコンソールアペンダーを追加できます。

7. 結論

これで、アペンダーの欠落に関するlog4j警告を解決する方法に関するこの短いチュートリアルは終わりです。 アペンダーとは何か、設定ファイルで警告の問題を解決する方法を説明しました。 次に、アペンダー加法性がどのように機能するかを説明しました。 最後に、コードで警告を解決する方法を示しました。

いつものように、例のソースコードはGitHubから入手できます。