PHP - ログ - ソースで出力

 クラウディア
1. 概要
2. error_log
3. 指定ファイルへの出力
4. ライブラリ化
5. もうひと工夫

1. 概要

 「FUNCTION」を使用することで、ソースに意図的にコードを埋め込んで、ログを出力することができます。  本ページは、下記のサイトを参考にさせていただきました。
PHP: error_log - Manual

2. error_log

 ログの出力は

error_log('メッセージ');
 で行います。  メッセージの出力は、ウェブサーバのエラーログに出力されます。

3. 指定ファイルへの出力


error_log('メッセージ', 3, 'ファイル名');
 と記述することにより、任意のファイルにログを出力することができます。  ただし、  ファイルの所有者はウェブサーバのユーザになりますので、FreeBSD で apache の場合、www ユーザの書き込み権限が必要です。  ウェブサーバのエラーログは行数を1回につき1行に制御していますが、任意のファイルに出力する場合は、改行がつきませんので、ログの出力時に末尾に改行コードをいれてやる必要があります。  ファイル名にパスを指定しないと、ウェブサーバのドキュメントディレクトリに作成されますので、別の場所に出力するには、絶対パスで指定する必要があります。  ウェブサーバのログは、一度変換がかかるため、日本語は文字化けしてしまいますが、指定ファイルへ出力する場合は、他の出力が混在しませんので日本語の文字化けはありません。

4. ライブラリ化


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 も使えそうに書いてあるのですが・・・。

5. もうひと工夫

 欲を出して、タイムスタンプ・ファイル名・関数名・行番号まで出しちゃいましょう。

/**
 * エラーログ
 * @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__, "メッセージ");
ハイスピードプラン