log4j:WARNweb.xmlにロガーのアペンダーが見つかりませんでした


80

すでにlog4jConfigLocationをweb.xmlに配置しましたが、それでも次の警告が表示されます。

log4j:WARN No appenders could be found for logger ⤦
    ⤥ (org.springframework.web.context.ContextLoader).
log4j:WARN Please initialize the log4j system properly.

私は何を取りこぼしたか?

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
    "java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/applicationContext.xml
        </param-value>
    </context-param>
    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>/WEB-INF/classes/log4j.properties</param-value>
    </context-param>

    <listener>
        <listener-class>
            org.springframework.web.util.Log4jConfigListener
        </listener-class>
    </listener>
    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>

    <servlet>
        <servlet-name>suara2</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>suara2</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

回答:


43

それがlog4j.propertiesファイル全体である場合、実際にロガーを作成していないように見えます。次のような行が必要です。

log4j.rootLogger=debug,A1

1
@Kaffiene:質問全体を読んでいないのはあなたのようです(この場合、質問に対する著者のコメントの1つが、回答が参照する情報を提供します)。@CodeGoat:すべてのコメントを読むための+1。
フランシスコアルバラド

@FranciscoAlvaradolog4j.propertiesクラスパスにファイルがありますが、コンソールに表示されます。
UdayKiran Pulipati 2014年

29

クラスパスの正しい場所にlog4j.propertiesがありましたが、それを直接使用したものでこの警告が表示されました。commons-loggingを介してlog4jを使用するコードは、何らかの理由で問題ないように見えました。

あなたが持っている場合:

log4j.rootLogger=WARN

次のように変更します。

log4j.rootLogger=WARN, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern=%5p [%t] (%F:%L) - %m%n

http://logging.apache.org/log4j/1.2/manual.htmlによると:

ルートロガーは匿名ですが、Logger.getRootLogger()メソッドを使用してアクセスできます。ルートにアタッチされたデフォルトのアペンダーはありません。

これが意味することは、ロギングを実行するには、ルートロガーにいくつかのアペンダーを指定する必要があるということです。

そのコンソールアペンダーをrootLoggerに追加すると、この苦情は消えます。


1
これはどこに貼り付けられますか。
UdayKiran Pulipati 2014年

@udaykiranpulipatiこれをlog4j.propertiesに貼り付けることができます。log4j.propertiesがない場合、SBT / Gradle / Maven / etcを使用している場合は、src / main / resources /に作成します。それ以外の場合は、クラスパスのルート(おそらくsrc /)になる場所に配置します。
Alain O'Dea

19

log4j.propertiesクラスパスにが存在しない場合、このエラーが発生する可能性があります。

つまりlog4j.properties、をsrcフォルダーに移動し、出力をbinフォルダーに設定して、実行時log4j.propertiesにbinフォルダーから読み取り、エラーを簡単に解決できるようにする必要があります。


1
デスクトップアプリケーション(アプレット)でも同じ問題が発生します。ファイルlog4j.propertiesはすでにsrcフォルダーにあります。「出力をbinフォルダーに設定」するにはどうすればよいですか?
Dilshad Rana

7

log4jがファイル「log4j.properties」または「log4j.xml」をどこにも見つけられない場合、この警告が表示されます。


2
場所が正しいことを確認します。coz log4j.propertiesの名前を別の名前に変更すると、エラーが発生します
cometta 2009

7

または、ログ構成ファイルがロードされる前に、私が行ったことを実行してロガーを定義することもできます。これは彼らが言うようになります:「カートを馬の前に置く」。

コード内:

public static Logger logger = Logger.getLogger("RbReport");

...後で

PropertyConfigurator.configure(l4j);
logger = Logger.getLogger("RbReport");

修正は、構成がロードされた後にロガーを初期化することでした。

オタクにとっては「デカルトb4d馬を置く」でした。


5

スタンドアロンのlog4jアプリケーション用に構成する場合は、BasicConfiguratorを使用できます。このソリューションは、Spring環境のようなWebアプリケーションには適していません。

あなたは書く必要があります-

BasicConfigurator.configure();

または

ServletContext sc = config.getServletContext();
String log4jLocation = config.getInitParameter("log4j-properties-location");
String webAppPath = sc.getRealPath("/");
String log4jProp = webAppPath + log4jLocation;
PropertyConfigurator.configure(log4jProp);

4

それでも問題が解決しない場合は、アーカイブの名前を確認してください。正確な「log4j.properties」または「log4j.xml」(大文字と小文字を区別)である必要があり、「AlainO'Dea」のヒントに従ってください。同じエラーが発生していましたが、これらの変更を行った後はすべて正常に機能します。ちょうど魅力のように:-)。お役に立てれば。


3

私の場合、解決策は簡単でした。で何も宣言する必要はありませんweb.xml

プロジェクトはWebアプリケーションであるため、WEB-INF/classesデプロイメント後に構成ファイルをオンにする必要があります。これを行うには、Javaリソースフォルダー(src/main/resources)を作成することをお勧めします(ベストプラクティス)。別のアプローチは、構成ファイルをに配置することsrc/main/javaです。

構成ファイル名に注意してください。XMLを使用している場合、ファイル名はlog4j.xml、それ以外の場合はlog4j.propertiesです。


2

これらの行をweb.xmlの先頭に配置します。

<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:/main/resources/log4j.xml</param-value>
</context-param> 

log4jConfigLocationを指定する必要はありません。クラスパスから取得します。
クリシュナ

クラスフォルダ内にxmlファイルを追加しましたか?
クリシュナ

私のlog4jはsrc / main / resources / log4j.xmlの下にあります(私は春の統合を使用しており、構成ファイルはsrc / min / resources / META-INF / spring / Integration / spring-integration-context.xmlの下にあります)
MariemJab

クラスパスの下のリソースフォルダ?
クリシュナ

1

OK、たくさんの答えがあり、いくつかは非常に正しいと思います。しかし、私の問題を解決したものはありませんでした。私の場合の問題は、UNIXファイルシステムのアクセス許可に、rootが所有するサーバーで編集していたlog4j.propertiesファイルが含まれていたことでした。rootのみで読み取り可能です。ただし、私がデプロイしていたWebアプリケーションは、TomcatがLinuxシステムでユーザーtomcatとして実行されるため、ファイルを読み取ることができませんでした。お役に立てれば。そのため、解決策は、log4j.propertiesファイルが存在するディレクトリに「chowntomcat:tomcatlog4j.properties」と入力することでした。


1

web.xmlにlog4jExposeWebAppRoot-> falseを追加します。それは私と一緒に動作します:)

<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>path/log4j.properties</param-value>
</context-param>
<context-param>
    <param-name>log4jExposeWebAppRoot</param-name>
    <param-value>false</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

0

私も同じ問題を抱えていました。同じ構成設定と同じ警告メッセージ。私のために働いたのは: エントリの順序を変更することでした。

  • ログ構成のエントリ[コンテキストパラメータとリスナー]をファイルの先頭[applicationContext.xmlのエントリの前]に配置すると、機能しました。

順序は重要だと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.