3

Tomcat 6を使用していて、JULをLog4j2(2.0ベータ3)に切り替えようとしています。ただし、これはまったく新しいプロジェクトであるため、ドキュメントは非常にまばらで、オンラインのリソースはまだ多くありません。

欲しいもの

  1. デバッグレベルを超えるすべてのイベントは、ディスク上のファイルに送信される必要があります。
  2. エラーはに移動する必要がありsyserrます。
  3. 情報から警告まですべてがに行く必要がありsysoutます。
  4. マークされた監査ログは、これをすべてスキップして、ディスク上の別のファイルに移動する必要があります。

私が試したこと

これは私の最初の試みlog4j2.xmlファイルです:

何を書けばいいconfiguration statusですか?それに関するいくつかのドキュメントはどこにありますか?

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="info">
<appenders>
    <Console name="Console-err" target="SYSTEM_ERR">
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
    <Console name="Console-out" target="SYSTEM_OUT">
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
    <File name="MyFile" fileName="app.log">
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </File>
</appenders>
<loggers>
    <logger name="com.ecm" level="error" additivity="false">
        <appender-ref ref="Console-err" />
        <appender-ref ref="MyFile" />
    </logger>
    <root level="info">
        <appender-ref ref="Console-out" />
        <appender-ref ref="MyFile" />
    </root>
</loggers>
</configuration>

ロガー名はJavaクラスとそのロガーとどのように関連していますか?

コード例:

package com.ecm.backend;

public final class Foo {
   private static final Logger LOG = LogManager.getLogger(Foo.class);

   public static void bar() {
     LOG.error("this is error");
     LOG.warn("this is warning");
   }
}

これを実行すると、コンソールとログファイルに次のように表示されます。

10:22:49.385 [http-8080-3] ERROR com.ecm.backend.Foo - this is error

警告が無視されるのはなぜですか?

を削除するとadditivity="false"、次のようになります。

10:26:51.388 [http-8080-1] ERROR com.ecm.backend.Foo - this is error
10:26:51.388 [http-8080-1] ERROR com.ecm.backend.Foo - this is error

警告は再び無視され、エラーが繰り返されます(予想どおり)。

私は何が間違っているのですか?


フォールドの下で:Tomcatの残りの部分はJULIを使用できますが、アプリケーションにはLog4j2が必要です。

4

1 に答える 1

4

構成 status="debug" を設定すると、構成プロセス中に何が起こるかについて、多くの log4j2 内部ログ ステートメントが表示されます。これは、構成の問題のトラブルシューティングに役立つ場合があります。

私は通常、構成の status="warn" を設定するので、問題が発生した場合にのみ通知を受け取ります。

ロガー名、ロガー、およびそれらの Java クラスの関係については、おそらくこれが役立ちます: http://logging.apache.org/log4j/2.x/manual/architecture.html

警告が無視される理由については、次のロガー構成があります。

<logger name="com.ecm" level="error" additivity="false">

次のようなロガーもあります。

Logger LOG = LogManager.getLogger(com.ecm.backend.Foo.class);

ロガー構成「com.ecm」は LOG ロガーからのすべての呼び出しを処理しますが、「エラー」レベル以上 (致命的) の呼び出しのみが実際にログに記録されます。他のレベル (warn、info、debug、および trace) のログ イベントは、レベルが低すぎるため除外されます。

加法性が機能する方法は、最初に名前付きロガー構成 (この場合は「com.ecm」) が、イベントを除外するかどうかを決定することです。次に、additivity="true" (デフォルト) の場合、イベントは親ロガー (この場合はルート ロガー) に渡されます。「警告」レベルのイベントは「com.ecm」ロガー設定によってすでに除外されているため、ルート ロガーには到達しません。

何を達成しようとしているのかはわかりませんが、異なるイベント レベルを異なるアペンダーに送信したい場合は、ロガーではなくアペンダー リファレンスにレベルを設定する方法があります。

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="info">
<appenders>
    <Console name="Console-err" target="SYSTEM_ERR">
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
    <Console name="Console-out" target="SYSTEM_OUT">
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
    <File name="MyFile" fileName="app.log">
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </File>
</appenders>
<loggers>
    <logger name="com.ecm" additivity="false">
        <appender-ref ref="Console-err" level="error" />
        <appender-ref ref="MyFile" level="debug" />
    </logger>
    <root>
        <appender-ref ref="Console-out" level="info" />
        <appender-ref ref="MyFile" level="debug" />
    </root>
</loggers>
</configuration>

これにより、LOG ロガーの出力が MyFile に送信され、(レベルがエラーまたは致命的である場合) Console-err にも送信されます。

「com.ecm」パッケージに含まれていないロガーからの出力は MyFile に送信され、(レベルが info、warn、error、または fatal の場合) Console-out にも送信されます。

于 2013-05-14T13:52:49.373 に答える