Struts1.3.5でlog4jを使うとWARNが表示される

以下のエラーがサーバ起動時(アプリケーションデプロイ時)に発生する。

log4j:WARN No appenders could be found for logger (org.apache.struts.util.PropertyMessageResources).
log4j:WARN Please initialize the log4j system properly.

環境

  • WebLogic8.1J(もしくは9.1J)
  • Struts1.3.5
  • log4j1.2.13(もしくは1.2.14)
  • commons-logging-1.0.4(Strutsに入っていたもの)

たぶんTomcatでもでるんじゃないかな?

 

調査

Strutsのログを出しているのが「commons-logging」。commons-loggingはLoggerを作るために、いろいろな設定を順番に探しに行くらしい(参考:commons-logging/1.1)。

そして今回のケースではlog4jのjarをクラスパス上においてあるため、commons-loggingがそれを見つけ、log4jを使って
Loggerを作ろうとしたんだけど、「org.apache・・・」というカテゴリがlog4jの設定ファイル(log4j.xml)に書かれていない
のでエラーになってしまう。

 

対応策

commons-logging.propertiesを使う

log4jよりも先に読まれる「commons-logging.properties」を使って、Loggerの作成にJDKを使うように設定する。

まずcommons-logging.propertiesファイルを作成し、中にこう記述する。

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

これをクラスパスが通っているところ「WEB-INF/classes」に置いた。ちなみに環境がJDK5.0なのだけど、Jdk14Loggerを指定しても問題なかった。

 

log4j.xmlを使う

log4j.xmlをクラスパスに置いてそれをStrutsに読んでもらう。log4j.xmlを「WEB-INF/classes」に置く。そして以下のカテゴリを追加。Log4jを使うのであればこっちが現実的。

<logger name="org.apache">
  <level value="warn" />
  <appender-ref ref="CONSOLE" />
</logger>

「org.apache.commons.digester.Digester」などもLogを出すらしいのでname属性を[org.apache」にした。これで一応成功。

また、rootで指定すれば「org.apache」という指定がいらなくなる。

<root>
  <level value="warn" />
  <appender-ref ref="CONSOLE" />
</root>

参考ページ