php - ログの出力

 
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__, "メッセージ");