2016年7月12日火曜日

第11,12回 WEB電子カルテのインストール(その3)

前回に引き続いてWEB電子カルテのインストールを行います。前回は、Tomcatプロジェクトで開発したWEB電子カルテが起動しないので苦労しました。原因はeclipseからはTomcatプロジェクトを起動できない(らしい)ことにあったようですが、そのからくりは正直なところよくわかりません。もっと腰を落ち着けて、じっくりと考える必要があるとは思いますが、講義回数もあと5回と残り少なくなってきたので、とりあえず先に進むこととします。

もっとも大切なこと、それはログファイルを見ること


いよいよWEB電子カルテがTomcat上で作動し始めたら、様々なエラーに遭遇します。たとえば次のようなエラーです。



 このエラーを解決するためにデバッグ作業を行います。しかし、このエラーメッセージを見てもどこから手を付ければよいのかわかりません。そんなときに役立つのがログです。いえ、ログにしか解決のためのヒントは存在しません。ですから、何はともあれ、まず、ログを見る習慣を身につけましょう。




ログは、Tomcatをインストールしたフォルダ内のlogsというフォルダにあります。たくさんの種類がありますが、エラーはtomcat8-stderr.YYYY-MM-DD.logに吐き出されます。 大量の情報が出力されていますが、その中からこのエラーを直接引き起こした原因を探ります。この場合は
log4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException: e:\webkarte_log\webKarte.log (指定されたパスが見つかりません。)
というメッセージです。ファイルe:\webkarte_log\webKarte.logがないと言っています。

Tomcatのセキュリティポリシーファイル conf/catalina.policy


Tomcatにはセキュリティのためのしくみ「セキュリティマネージャ」というのがあるようです。
「セキュリティマネージャ」(java.lang.SecurityManagerクラスが使われる)とは、信頼されていないコードを実行することでローカルファイルシステム上にあるファイルへとアクセスしたり、Javaアプレットのダウンロード元のホスト以外と通信して情報を送受信したりといったことができないように、Javaアプレットがサンドボックス内で実行できるようにする機構です。
とのことです(参照)。要するに勝手にアプリケーションが通信をしたり、ある特定のファイルにアクセスしたりできないようにする仕組みのようです。WEB電子カルテはORCAサーバやPostgreSQLサーバと通信したり、ログファイル(webKarte_log/webkarte.log)にアクセスしたりするため、これらを利用できるように許可(Permission)を与えなければならないようです。それをしているのがW教授の虎の巻「開発用Window設定」のP10の18)です。これをセキュリティポリシーというそうです。 下記がその設定例です。
grant{
 permission java.util.PropertyPermission "org.apache.commons.logging.LogFactory.HashtableImpl", "read";
 permission java.util.PropertyPermission "org.seasar.framework.container.factory.config", "read";
 permission java.util.PropertyPermission "org.seasar.framework.container.factory.S2ContainerFactory", "read";
 permission java.lang.RuntimePermission "setContextClassLoader", "read";
 permission java.lang.RuntimePermission "*", "read";
 permission java.lang.reflect.ReflectPermission "suppressAccessChecks", "read";
 permission java.io.FilePermission "c:/webKarte_log/webkarte.log","read, write";
 permission java.net.SocketPermission "struts.apache.org:80","connect, resolve";
 permission java.net.SocketPermission "172.16.111.123:8000","connect,resolve";
 permission java.net.SocketPermission "172.16.111.123:8001","connect,resolve";
 permission java.net.SocketPermission "172.16.111.123:5432","connect,resolve";
 permission java.net.SocketPermission "172.16.111.123:5432","connect,resolve";
};
ポリシファイルの書式については、例えばこのサイトを参考にしてください。以下にgrantエントリの書式を示します。そして、このgrantエントリを複数並べてポリシーを校正するそうです。
 
 
// Example policy file entry

grant [signedBy ,] [codeBase ] {
  permission  <パーミッションクラスの完全修飾名> <ターゲット>, <アクション>;
};
signedByは署名者の情報(誰が署名したクラスに対するパーミッションなのか)、codeBaseはWebアプリケーションのホームディレクトリをURL形式で書きますが、省略するとすべてが対象になるようです。 上の例でいえば、例えば2行目は、"org.apache.commons.logging.LogFactory.HashtableImpl"プロパティに対する読み取り権、5行目は"setContextClassLoader"を使用するための権限を付与し、8行目は、"c:/webKarte_log/webkarte.log"というファイルに読み書きのアクセス権を付与しています。
ところで、このファイル名、どこに設定してあるのでしょうか? ログを辿って調べてみると、web.karte.common.Log.javaに
private static final String LOG4J_XML = "log4j.xml";
のように定義されていました。つまり、log4j.xmlを見ろと。で、そのlog4j.xmlはどこに? srcディレクトリ内にありました。内容は以下の通りです。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

   <appender name="Appender1" class="org.apache.log4j.RollingFileAppender">
      <param name="File" value="c:\\webkarte_log\\webKarte.log" />
      <param name="MaxFileSize" value="1MB" />
      <param name="MaxBackupIndex" value="5" />
      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d %-5p %x:%m%n"/>
      </layout>
   </appender>

  <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern"
        value="%d %-5p %x:%m%n"/>
    </layout>
  </appender>

 <!-- level(DEBUG < INFO < WARN < ERROR < FATAL) -->
 <root>
  <level value="INFO" />
  <appender-ref ref="Appender1" />
  <appender-ref ref="STDOUT" />
 </root>
</log4j:configuration>
6行目にちゃんと定義してありますね。

0 件のコメント:

コメントを投稿