misima 漢詩 Tomcat, Log4j エラー

misima 漢詩作成支援の機能追加を終えて,Tomcat ログ,misimaKansiServlet ログを眺めていたら,気になるエラーが出ていた。システム自体は正常に動作しているので,別に構わないわけだけれども対処することにした。
 

* * *

一つ目のエラーは Tomcat-5.5(JSP / Servlet コンテナのデファクトスタンダード・ソフトウェアのちょっと古めのバージョン)/usr/local/tomcat55/logs/stdout.log に出ていたもの。

log4j:WARN No appenders could be found for logger →(折返し。実際は 1 行)
    (org.apache.commons.digester.Digester.sax).
log4j:WARN Please initialize the log4j system properly.

二行目の initialize 云々でロガー(ログ管理システム)Log4j の初期化がうまく行っていないようである。misimaKansiServlet そのものは独自に Log4j のプロパティ・ファイルを読み出して Log4j を初期化している。つまり,以下のように,デプロイメントディスクリプタ web.xmlinit-param タグにログ・プロパティ・ファイルの場所を書いておき,misimaKansiServlet Java プログラムから参照して logger を初期化している。

<servlet>
  <servlet-name>misimaKansiServlet</servlet-name>
  <servlet-class>misimaKansiServlet</servlet-class>
  ...
  <!-- logging プロパティのパス -->
  <init-param>
    <param-name>logproperty</param-name>
    <param-value>
      /usr/local/tomcat5.5/webapps/misimakansiservlet/log4kansi.properties
    </param-value>
  </init-param>
</servlet>
public class misimaKansiServlet extends HttpServlet {
    /** log4j property */
    private static String prop = "log4kansi.properties";
    /** log4j logger */
    private static Logger mslog;
    ...
    /** 初期化 */
    public void init() throws ServletException 
    {   
        // web.xml デプロイメントディスクリプタから初期パラメータを取得する.
        String p = getInitParameter("logproperty");
        if (p != null) { prop = p; }
 
        // log file initialize.
        mslog = Logger.getLogger(misimaKansiServlet.class.getName());
        PropertyConfigurator.configure(prop);
        mslog.info("misimaKansiServlet initialize.");
        mslog.info("- log properties file: " + prop);
    }
...

これで何でまだ初期化されていないなどと言われるのか。misimaKansiServlet のログは初期化されてきちんとロギングできるので,どうやら Log4j の親玉みたいなクラスがシステムとしてのロガーの初期化ができないということのようである。調べたら,このためのプロパティ・ファイルを Log4j がきちんと読めるようにしておけばよいとわかった。つまり,/usr/local/tomcat5.5/conf/log4j.properties に全体用プロパティ・ファイルが格納されているとして,Tomcat 起動時に参照する JAVA_OPTS 環境変数に以下を追加記述しておけばよい。

-Dlog4j.configuration=file:///usr/local/tomcat5.5/conf/log4j.properties

これで Tomcat を再起動すれば,エラーは出なくなった。私の FreeBSD 環境の場合 Tomcat 起動用スクリプトのなかで JAVA_OPTStomcat55_java_opts 環境変数から取得しているので,/etc/rc.conf に以下を追加した。

tomcat55_java_opts="-Dlog4j.configuration=→(折り返し)
file:///usr/local/tomcat5.5/conf/log4j.properties"
 
* * *

二つ目のエラーは,misimaKansiServlet ログの DWR 関連メッセージである。

12/01/30 18:24:18.079, ERROR, 
[TP-Processor6] org.directwebremoting.util.LogErrorHandler,
42: Line=23 The content of element type "dwr" must match 
"(init?,allow?,signatures?)".

文面からは何も原因を想定できない。DWR サイト内を検索したら,メーリングリストに同じエラーに遭遇した人の投稿とそれへの回答があり,難なく原因がわかった。misimaKansiServlet 用の DWR 定義ファイル dwr.xml の記述において,今回追加した Java クラスのために allow タグも追加したのだが,これがまずかった。このタグは複数書いてはいけない仕様だったのである(それでも追加プログラムが動いてくれるのが面白い)。よって,対策は一つの allow タグにすべて放り込む,というのでOKだった。

<dwr>
  <!-- without allow, DWR isn't allowed to do anything -->
  <allow>
    <create creator="new" javascript="SigoTable">
      <param name="class" value="SigoTable" />
    </create>
    <convert converter="bean" match="SigoBean" />
  <!--
  </allow> 単一 allow にするため削除
  <allow>  同上
  -->
    <create creator="new" javascript="KanjiTable">
      <param name="class" value="KanjiTable" />
    </create>
    <convert converter="bean" match="KanjiBean" />
  </allow>
</dwr>