以下のエラーがサーバ起動時(アプリケーションデプロイ時)に発生する。
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>