2016-06-30 37 views
1

私は数日間この頭を叩いてしまいました。 Log4j2互換性ライブラリを追加すると、Log4j2は下位互換性があります。log4j1に対して書かれたコンポーネントは、log4j2のアップグレード後にログに記録されません。

のlib \マイWEB-INFがあります

  • SLF-API
  • のlog4j-1.2-API(後方compatのライブラリ。)
  • のlog4j-API(log4j2)
  • log4jのコア(log4j2)
  • のlog4j-ウェブ(Webアプリケーションの自動配線)

私のweb.xmlがあります:

<!-- log4j2 auto-wiring --> 
<context-param> 
    <param-name>log4jConfiguration</param-name> 
    <param-value>file:///${catalina.base}/conf/log4j2.xml</param-value> 
</context-param> 

マイ[Tomcatの] /conf/log4j2.xmlは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="debug"> 
    <Appenders> 
     <!-- Appends to CONSOLE --> 
     <Console name="consoleAppender" target="SYSTEM_OUT"> 
      <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY" /> 
      <PatternLayout pattern="%5p (%F:%L) - %m%n" /> 
     </Console> 
    </Appenders> 
    <Loggers> 
     <Logger name="com.mycompany.componentA" level="WARN" /> 
     <Logger name="com.mycompany.componentA.QueryLogger" level="DEBUG" /> 
     <Logger name="com.mycompany.mycode" level="DEBUG" /> 
     <Root level="WARN"> 
      <AppenderRef ref="consoleAppender" /> 
     </Root> 
    </Loggers> 
</Configuration> 

私はAPIをlog4j2するために私のコントロール(com.mycompany.mycode)の下でコードをアップグレードしていると、彼らは仕事/完璧にログインします。私のコントロール下ではなくlog4j1(com.mycompany.componentA)に対して書かれたコードは、単にログに記録できません。エラーなし、デバッグなし、何もありません。

私はアプリケーションを起動すると、アプリケーションの起動時に誤った設定に関するlog4j1警告が表示されます。これは、WAR内にlog4j1ライブラリ(互換性APIを除く)が存在しないため、私にも悩まされています。警告:

log4j:WARN No appenders could be found for logger (com.mycompany.componentB) 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 

答えて

0

編集:私は(最終的に)何が起こっているかを考え出しました。私の依存関係の1つはひどく悪いことでしたし、log4j1クラスを最終的なjarファイルにまとめました。したがって、classpathにはlog4j1のjarファイルはありませんが、クラスパスにlog4j1クラスがあります。

私はこの作業を取得することができた唯一の方法は、することでした:

  1. はレッツLog4j2
  2. (log4j2構成は、私が望んでいたすべてのロガーを含んでいても)log4j1とlog4j2 XML設定ファイルの両方を作成します'log4j-web'アーティファクト+ 'log4jConfiguration' web.xmlパラメータを使用して自動配線する
  3. 廃止予定のLog4jConfigurer.initLoggingを呼び出すことによって、log4j1を手動で配線する)APIサーバーの起動時に

これはおそらくひどく間違っていますが、上記のように、私が周りをだますの周りに働いている唯一の方法でした。

lo4j1ブリッジを理解することは、log4j2を配線してブリッジを含むことがすべて必要であることです(たとえば、手動でlog4j1を配線する必要はありません)。実際には、それは発生していないようです。

+0

これは、Ralphと、log4j1 jarがまだクラスパスにあるという私の仮説を確認します。 –

+0

Log4j 1のjarの場所を見つける別の方法で私の答えを更新しました。 –

+0

いいえ、確認していません。すべてのlog4j1 API呼び出しは、log4j2呼び出しにブリッジされます。だから私が本当に確認していることは、あなたが何が間違っているのか分からないということです。 –

0

このエラーメッセージは、アプリケーションにlog4j-1.x jarファイルがあることを意味します。あなたのWEB-INF/libでそれを探し、それを取り除くとうまくいくはずです。

+0

要約するとwebinfにlog4j1ライブラリがありません –

+1

あなたが見ているメッセージはlog4j 1.xの初期化コードから来ているので、どこかのclassparhになければなりません。あなたがそれを見つけるまで見続ける。 – rgoers

0

WEB-INF/libにない場合は、Webコンテナ(Tomcat?)の共有libフォルダにありますか? RalphはこのエラーメッセージがLog4j-1.2によって生成されるのは間違いないので、クラスパス上のどこかにあります...必要に応じてシステムプロパティjava.class.pathの値を表示してみてください。


更新:Log4j1ジャーの場所を見つけるための別の方法は、アプリケーションからorg.apache.log4j.AppenderSkeleton.class.getResource("/org/apache/log4j/AppenderSkeleton.class")の値を印刷することです。

(私はもともとCategoryを示唆したが、これもそうAppenderSkeletonが優れている、Log4jの1橋に存在します。)

+0

私たちの回答は役に立ちましたか? –

関連する問題