15

Tomcat 6 にデプロイされた apring webapp のロギング設定に問題があります。

webapp は commons-logging api を使用します。実行時は log4j を使用する必要があります。ログ ファイルは作成されますが、空のままです。ログ エントリは発生しません。

セットアップは次のとおりです。

WEB-INF/web.xml:

 <context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/log4j.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
  </listener>

WEB-INF/classes/commons-logging.properties:

org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger

WEB-INF/log4j.xml:

<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>

  <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
    ...
  </appender>
  <appender name="FILE" class="org.apache.log4j.RollingFileAppender">
    <param name="File" value="${catalina.home}/logs/my.log"/>
    ...
  </appender>

  <logger name="my.package">
    <level value="INFO"/>
  </logger>

  <root>
    <level value="ERROR"/>
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="FILE"/>
  </root>
</log4j:configuration>

ファイル logs/my.log が作成されますが、ログは表示されません。これは tomcat コンソールの情報ログですが、構成されたレイアウト パターンではありません。

commons-logging-1.1.1.jar と log4j-1.2.14.jar は WEB-INF/lib に含まれています。ここで何が間違っているのですか?

4

6 に答える 6

10

commons-logging の使用について人々に警告する Web 上の文書化されたインスタンスが多数あります。そのため、SLF4Jの人気が高まっています。

Log4j で Tomcat を使用することに関心がないことを考慮すると、アプリケーションで直接 Log4j を使用する必要があります。特に、将来ロギング フレームワークを切り替える可能性がない場合は注意が必要です。アプリケーションの複雑さを軽減し、commons-logging で発生しているクラス ローダーの問題を取り除きます。

commons-logging と log4j はどちらもロギング メソッドに同様の呼び出し構造を使用するため、これは比較的簡単にテキスト内で検索および置換できるはずです。

于 2008-10-20T15:11:24.457 に答える
5

Tomcat commons/lib ディレクトリに log4j.jar を配置していないことに特に注意してください。ルート クラスローダが log4j ライブラリをロードすると、Web アプリケーションも log4j を使用しようとすると、競合や初期化の問題が発生します。

一般的な Tomcat ロギングに log4j を使用する必要がある場合は、Web アプリケーションが log4j もロードしようとしないように注意する必要があります。サーバー上に複数の Web アプリケーションがある場合は、各 Web アプリケーションのログの初期化が他の Web アプリケーションの初期化を妨げないようにする必要があります。各 Web アプリケーションは一意のロガー ID を使用する必要がありますが、これは一意のパッケージ名で実現できます。

Tomcat で共通の log4j を複数の Web アプリケーションと一緒に使用すると、Hibernate や Spring などのすべてのロギングを行う共有ライブラリがある場合、深刻な競合が発生します。log4j の初期化を試みる次の webapp は、前のロガーを閉じる可能性があります。混乱する可能性があります。

于 2008-10-22T18:25:57.153 に答える
3

私は同様の問題を抱えていて、今修正を見つけました。追加のパラメーターを使用して tomcat を起動します。

-Dorg.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.LogFactoryImpl

于 2011-04-01T00:23:42.577 に答える
1

完全な commons-logging のために追加のコンポーネントをコンパイルする必要があります。デフォルトでは、Tomcat 6 は、常に java.util.logging に委譲する commons-logging のハードコーディングされた実装を使用します。

ビルド手順はこちらhttp://tomcat.apache.org/tomcat-6.0-doc/building.html

次に、Tomcat の /bin ディレクトリにある tomcat-juli.jar を置き換え、log4j および config とともに tomcat-juli-adapters.jar を /lib ディレクトリに配置します。

于 2008-10-20T13:35:09.380 に答える
0

log4j +common ロギングを使用している場合は、上記の構成のほとんどを回避できます。共通ロギング LogFactory には JAXP と同様の検出機能があり、次の優先順位でログ実装を検索します。1. ファイル commons-logging.properties 内の構成属性 org.apache.commons.logging.Log logging.Log 3. Log4J がクラス パスで使用可能な場合は、対応するラッパー クラス (Log4JLogger) を使用します。4. Jdk14Logger 5. SimpleLog

common-logging.jar と common-logging-api.jar と log4j.jar の両方がクラスパスにあることを確認してください。

于 2010-09-28T14:27:33.440 に答える
-1

私が間違っているかもしれません。次のことを試してください。

A) 次のように my.package にアペンダーを追加します: または B) root のログレベルを INFO に減らします

于 2010-02-18T12:40:47.770 に答える