アプリケーションログの作り方 -PHPアプリ- | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

ログと言うのも、様々あってH/WやOSの問題を知らせてくれるものや、ミドルウェアの動作についての各種情報を出力してくれるものもあります。


こうしたログは、主に問題があったときにその原因を調査する事に一役買うわけですがアプリケーションのログと言うのも同じように重要なものです。


PHPでアプリを構築した場合、PHPの設定(PHP.INIファイル)により、PHP上で起きたエラーなどをログファイルに出力する事が可能です。


※ エラーなどをそのままブラウザに出力させているようなサイトも見かけますがみっともないですし、エラーには様々な

  情報が含まれているのでセキュリティの観点からもよいことではありません。


ただこうしたPHPだけのログファイルでは、運用していく中で不便だったり情報が不足する場合があります。


- PHPのログファイルの内容は分かりづらく、ぱっと見て何が起きたのかが判断できない

開発と運用担当者を分けていたりする場合は、なお更ログと言うものは判断がつきやすい形式にしておいた方がよいです。


- エラー以外の情報を出力できない

例えばバッチ処理をPHPで作る場合に、その開始と終了の情報を出力したい場合があったりします。

(そもそもバッチが実行されたのかどうか容易に判断するため)


- 出力の形式を変更したい

運用のしやすいようにログのフォーマットを変更したい場合があります。


上記のような理由から、PHPのログとは別にアプリケーション上から出力される各種情報を保存するためのログファイルと言うのを用意した方がよいでしょう。


で、このアプリケーション用のログファイルですがもちろん、専用の関数でも使って所定のフォーマットでファイルに出力すると言うのでもよいですが、手っ取り早い方法としては、syslogを使うと言うのがあります。


syslogの一般的な知識については、こちら にお任せするとして、syslog上にはアプリケーション用のファシリティ(local0~local7)が用意されています。


/etc/syslog.confファイル(RedHatの場合)に、以下の記述を追加します。


local6.* /var/log/php_appli.log

RedHat ES3およびES4では、local7のファシリティはbootログとして設定されています。

設定後は、syslogプロセスの再起動を行います。


次に、PHPのアプリ上から設定したphp_appli.logファイルへログの出力を行います。

出力する際には、syslog() 関数を利用します。


<?php
// syslog関連の定数の初期化
define_syslog_variables ();

// syslogのオープン
openlog( "php_error", LOG_ODELAY, LOG_LOCAL6);

// ここで何かの処理をし、もし失敗した場合
if ($err_flg) {
syslog (LOG_WARNING, "XXXXが失敗しました");

closelog ();
?>


openlog関数の第3引数で「LOG_LOCAL6」の定数を渡しています。

これが、先ほどsyslog.confで設定したファシリティ「local6」のログファイル「/var/log/php_appli.log」へ内容が力させるための引数になっています。


また、openlog関数の第1引数に渡している「php_error」はsyslogへ出力した際のメッセージ部の接頭辞となります。
ログファイルの監視なんかをする場合は、この文字列とかをその対象に含めたりするとやりやすいです。


また、syslog関数で具体的なメッセージを出力していますが、メッセージだけではなく、$_SERVERなどの

グローバル変数から環境の情報を出したり__FILE__, __LINE__などを利用するとより詳しい情報を記録できます。