- 1. error_log
- 2. 指定ファイルへの出力
- 3. ライブラリ化
- 4. もうひと工夫
1. error_log
ログの出力は
error_log('メッセージ');
で行います。
メッセージの出力は、ウェブサーバのエラーログに出力されます。
2. 指定ファイルへの出力
error_log('メッセージ', 3, 'ファイル名');
と記述することにより、任意のファイルにログを出力することができます。
ただし、
ファイルの所有者はウェブサーバのユーザになりますので、FreeBSD で apache の場合、www ユーザの書き込み権限が必要です。
ウェブサーバのエラーログは行数を1回につき1行に制御していますが、任意のファイルに出力する場合は、改行がつきませんので、ログの出力時に末尾に改行コードをいれてやる必要があります。
ファイル名にパスを指定しないと、ウェブサーバのドキュメントディレクトリに作成されますので、別の場所に出力するには、絶対パスで指定する必要があります。
ウェブサーバのログは、一度変換がかかるため、日本語は文字化けしてしまいますが、指定ファイルへ出力する場合は、他の出力が混在しませんので日本語の文字化けはありません。
3. ライブラリ化
error_log('メッセージ', 3, 'ファイル名');
のままだとファイルを変更したりするときに面倒なので・・・。
改行もつけるようにして、関数化しました。
/**
* エラーログ
* @param string $message
*/
function errorlog($message)
{
error_log($message."\n", 3, 'フルパスログファイル名');
}
本当は引数を
function errorlog(string $message)
にしたかったんですけど。呼び出し側でエラーになる・・・。
PHP Catchable fatal error: Argument 1 passed to errorlog() must be an instance of string, string given, called in /ちゃい/index.php on line 3 and defined in /ちゃい/server.php on line 842
う~ん。
「PHP マニュアル - 言語リファレンス - 関数 - 関数の引数」を読むと今は string も使えそうに書いてあるのですが・・・。
4. もうひと工夫
欲を出して、タイムスタンプ・ファイル名・関数名・行番号まで出しちゃいましょう。
/**
* エラーログ
* @param string $message
*/
function errorlog($file, $function, $line, $message)
{
$messageEx = sprintf("[%s]", date("Y-m-d H:i:s"));
$messageEx .= sprintf("[%-24s]", $file);
$messageEx .= sprintf("[%-8s]", $function);
$messageEx .= sprintf("[%5d]", $line);
$messageEx .= ' '.$message;
$messageEx .= "\n";
error_log($messageEx, 3, 'フルパスログファイル名');
}
呼び出し側は、下記の形式で呼び出します。
errorlog(__FILE__, __FUNCTION__, __LINE__, "メッセージ");
|