今日から行う簡易エラーロギング - メールでのエラー通知

FileMaker Webアプリケーションに限らず、エラーのロギングはトラブルシューティング時に大変有用な情報となる。エラーが起きた際に、エンドユーザから問い合わせが入った時点でトラブルシューティングに入る場合と、エラーの前兆をメールで受信するなりログに記録するなりであらかじめ準備ができている場合とでは解決にかかるまでの時間も違ってくる。複雑なFileMakerファイルの場合、エラーの原因特定にも一苦労だ。

FileMakerエラーをメールで送信する

FX.phpでFileMaker Webアプリケーションを実装している場合は、FX.phpの機能を利用して、エラー発生時に特定のメールアドレス宛に通知メールを送信することが可能だ。FX.phpの先頭部分を直接修正する。修正箇所は次の3点。

  1. "EMAIL_ERROR_MESSAGES"定数をTRUEに設定
  2. $webmasterEmailAddress変数に、エラー通知を受け取りたいメールアドレスを指定
  3. $emailFromAddress変数に、From(差出人)となるメールアドレスを指定

これらの指定を行うだけでエラーが起こった際に、PHPのmail関数を使って$webmasterEmailAddressで指定したメールアドレス宛に通知メールが送信される。PHPのmail()が動作する要件さえ満たしておけば、FX.php内部で既にメール送信のロジックが実装されているので、既存ファイルに修正を行う必要はない。先の3点を修正するだけですぐに使用できるようになる便利な機能だ。メール本文のサンプルは次のとおり。

The following error just occured:

Message: FX: ExecuteQuery XML error: Mismatched tag at line 6

**This is an automated message**

あらかじめ成果物にこれらの設定をしておくことで、デベロッパやメンテナは、Webアプリケーションでなにか不都合が起きているときに、あらかじめメールでその状態をある程度確認できるようになる。メールが送信可能な環境などいくつか条件もあるが、できるだけ準備しておきたい機能だ。

さて、このエラー通知機能は、FX.php内部で発生した場合のエラーのみにメールが送信される。たとえばFileMaker Serverへのホスト情報やポート番号を間違えて指定している場合や、FileMakerファイルを開く際のアカウントが存在していない場合などだ。レイアウトやレコードやフィールドが見つからない場合や、FileMakerファイルが閉じている場合などのFileMakerエラーにはメールが送信されない。

FileMakerエラーが起きた場合にもメールを送信したい場合は、FX.phpの1693行目付近のFMAction()関数に処理を追加する。

FMAction() 修正前

 function FMAction ($Action, $returnDataSet, $returnData, $useInnerArray)
    {   
        $this->useInnerArray = $useInnerArray;
        $queryResult = $this->ExecuteQuery($this->actionArray[strtolower($Action)]);
        if (FX::isError($queryResult)){
            if (EMAIL_ERROR_MESSAGES) {
                EmailErrorHandler($queryResult);
            }    
            return $queryResult;
        }    
        if ($returnDataSet) {
            $dataSet = $this->AssembleDataSet($returnData);
            return $dataSet;
        } else {
            $this->ClearAllParams();
            return true;
        }    
    }

FMAction() 修正後

 function FMAction ($Action, $returnDataSet, $returnData, $useInnerArray)
    {
        global $errorsList;
        $this->useInnerArray = $useInnerArray;
        $queryResult = $this->ExecuteQuery($this->actionArray[strtolower($Action)]);
        if (FX::isError($queryResult)){
            if (EMAIL_ERROR_MESSAGES) {            EmailErrorHandler($queryResult);
            }
            return $queryResult;
        }    if ($returnDataSet) {
            $dataSet = $this->AssembleDataSet($returnData);
            if ( EMAIL_ERROR_MESSAGES && ( '0' !== (string)$dataSet['errorCode'] && '401' !== (string)$dataSet['errorCode'] ) )
            {
                EmailError( 'FileMaker Error ' . $dataSet['errorCode'] . ' - ' . $errorsList[$dataSet['errorCode']] );
            }
            return $dataSet;
        } else {
            $this->ClearAllParams();
            return true;
        }
    }

修正後ではFMAction()の先頭部分にglobal $errorsList;が。そして後半にif ( EMAIL_ERROR_MESSAGES ...)の分岐が追加されている。$errorsListは、FX.phpの成果物に含まれるMErrors.phpで定義されている、FileMakerエラー番号とエラー内容が対になった配列。エラー番号をキーとして、エラー内容を取得することができる。

"EMAIL_ERROR_MESSAGES"定数がtrueかつ、FileMaker Serverから返ったエラー値が0(エラーなし)と401(検索条件に一致するレコードがありません)以外の場合、FX.php内部関数のEmailErrorを実行するというものだ。EmailError関数の引数は1つ - 通知メールの本文に入力するメッセージを指定する。FX.phpにこの数行を追加しておくことで、FX.phpエラーのほかにFileMaker側でエラーが発生して場合でも通知が行われるようになる。修正後にFileMakerエラーが発生した場合のメール本文は次のとおり。

The following error just occured:

Message: FileMaker Error 105 - Layout is missing

**This is an automated message**

この修正を行なっておくことで、運用中に発生しえるFileMakerエラー

  • Webアプリケーション側のバグや設計ミスで、存在しないレイアウトやフィールド、レコードを参照した場合(101, 102, 104, 105など)
  • FileMaker Serverのバックアップ失敗やファイル破損などが生じ、ファイルが閉じられている場合(802, 805, 807, 808, 824など)
  • サーバのディスク容量が足りなくなり、レコードの追加や編集がおこなえなくなっている場合(801, 809など)

が発生した場合に、メールで随時通知が行なわれる。メールの通知回数が極端に多い場合、特定の箇所に重大なバグが潜んでいる可能性が大きいと言える。運用中のほか、開発中やβ公開中のシステムにも有効なロギング手段と言えるのではないだろうか。次回はFileMaker以外のデータベース - SQLiteにロギングを行なう方法を紹介しよう。