web-dev-qa-db-ja.com

Log4j2構成-log4j2構成ファイルが見つかりません

最近、log4j2ロガーの使用方法を学ぶことにしました。必要なjarファイルをダウンロードし、ライブラリ、xml構成ファイルを作成して、使用しようとしました。残念ながら、コンソール(Eclipse)でこのステートメントが表示されます。

ERROR StatusLogger No log4j2 configuration file found. Using default configuration:       logging only errors to the console.

これは私のテストクラスコードです。

package log4j.test;

import org.Apache.logging.log4j.LogManager;
import org.Apache.logging.log4j.Logger;

public class Log4jTest
{
    static final Logger logger = LogManager.getLogger(Logger.class.getName());

    public static void main(String[] args) {    
        logger.trace("trace");
        logger.debug("debug");
        logger.info("info");
        logger.warn("warn");
        logger.error("error");
        logger.fatal("fatal");
    }
}

そして私のXML設定ファイル:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration package="log4j.test" 
               status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="log4j.test.Log4jTest" level="trace">
            <AppenderRef ref="Console"/>
        </Logger>
        <Root level="trace">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

また、<Logger>タグなしのxml、パッケージ仕様、およびさまざまなフォルダー/パッケージディレクトリで試してみましたが、役に立ちませんでした。これで、私のlog4j2.xmlファイルはEclipseのプロジェクトフォルダーに直接配置されます。

78
Qbisiek

これはMavenなどのないシンプルなEclipse Javaプロジェクトですか?その場合、クラスパス上で見つけることができるようにするには、srcフォルダーの下にlog4j2.xmlファイルを配置する必要があります。 mavenを使用する場合は、src/main/resourcesまたはsrc/test/resourcesの下に配置します

131
Tomasz W

次の解決策のいずれかを選択する必要があります。

  1. プロジェクトのリソースディレクトリにlog4j2.xmlファイルを配置して、log4jがクラスパスの下のファイルを見つけるようにします。
  2. システムプロパティ-Dlog4j.configurationFile = file:/path/to/file/log4j2.xmlを使用します

Yamlを使用してlog4j2を設定する際に、ドキュメンテーションに従っていました- Apache Log4j2 Configuratoin および Apache Log4j2 Maven ドキュメントによると、次のMaven依存関係が必要です。

  <dependency>
    <groupId>org.Apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.8.1</version>
  </dependency>
  <dependency>
    <groupId>org.Apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.8.1</version>
  </dependency>

そして

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
    <version>2.8.6</version>
</dependency>

これらを追加するだけでは構成が選択されず、常にエラーが発生しました。 デバッグ設定 の方法は、-Dorg.Apache.logging.log4j.simplelog.StatusLogger.level=TRACEを追加することでログを見るのに役立ちました。後でMavenを使用してソースをダウンロードする必要があり、デバッグはlog4j2の依存クラスの理解に役立ちました。それらはorg.Apache.logging.log4j.core.config.yaml.YamlConfigurationFactoryにリストされています:

com.fasterxml.jackson.databind.ObjectMapper
com.fasterxml.jackson.databind.JsonNode
com.fasterxml.jackson.core.JsonParser
com.fasterxml.jackson.dataformat.yaml.YAMLFactory

jackson-dataformat-yamlの依存関係マッピングを追加しても、最初の2つのクラスはありません。したがって、jackson-databind依存関係を追加して、yaml設定を機能させます。

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.6</version>
</dependency>

MVNリポジトリTest Dependenciesバージョン項目のlog4j-apiセクションを参照して、バージョンを追加できます。例えば。 log4j-apiの2.8.1バージョンについては、この link を参照して、jackson-databindバージョンを見つけてください。

さらに、以下のJavaコードを使用して、クラスパスでクラスが使用可能かどうかを確認できます。

System.out.println(ClassLoader.getSystemResource("log4j2.yml")); //Check if file is available in CP
ClassLoader cl = Thread.currentThread().getContextClassLoader(); //Code as in log4j2 API. Version: 2.8.1
 String [] classes = {"com.fasterxml.jackson.databind.ObjectMapper",
 "com.fasterxml.jackson.databind.JsonNode",
 "com.fasterxml.jackson.core.JsonParser",
 "com.fasterxml.jackson.dataformat.yaml.YAMLFactory"};

 for(String className : classes) {
     cl.loadClass(className);
 }
11
James Jithin

IDEを強制的に更新するまで、Eclipseはファイルを参照しません。その機能!そのため、プロジェクト全体にファイルを配置すると、Eclipseはそれを完全に無視し、これらのエラーをスローします。 Eclipseプロジェクトビューで更新をクリックすると、動作します。

3
Mike Ashby

Tomasz Wが書いたことに加えて、アプリケーションを起動することで設定を使用できます:

-Dorg.Apache.logging.log4j.simplelog.StatusLogger.level=TRACE 

構成の問題のほとんどを取得します。

詳細については、Log4j2 FAQを参照してください。 構成をデバッグするにはどうすればよいですか?

私の場合、クラスパスがsrcフォルダーに設定されていても、プロジェクトのbinフォルダーに配置する必要がありました。理由はわかりませんが、試してみる価値はあります。

0
Florian