web-dev-qa-db-ja.com

Tomcat6を使用したSpringWebappでのCommonsLogging / Log4jセットアップの問題

Tomcat6でデプロイされたapringwebappのロギング設定に問題があります。

Webappはcommons-loggingapiを使用しますが、実行時には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>

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

Commons-logging-1.1.1.jarおよびlog4j-1.2.14.jarはWEB-INF/libに含まれています。ここで何が悪いのか考えてみませんか?

15
Arne Burmeister

Commons-loggingの使用について人々に警告する多くの文書化されたインスタンスがWeb上にあります。そんなに、 SLF4J は多くの人気を得ています。

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

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

10
Spencer Kormos

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

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

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

5
Mojo

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

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

3
Senthil

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

ここでの構築手順 http://Tomcat.Apache.org/Tomcat-6.0-doc/building.html

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

1
Jonas Klemming

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

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

0
lwpro2