PHPログ出力(車輪)

PHPでもログ出力用ライブラリは、いろいろあるようです。(log4php PEAR::Log) また車輪を作ってみました。例によって、最低限のログを出力するための機能を、標準関数error_logを使って実装した。
1
2
3
4
5
6
7
<?phprequire_once("Log.php");Log::error("エラー発生");Log::warn("警告 test");Log::info("情報 test");Log::debug(array('hoge' => 12));?>
の出力結果が下になるようにした。
2007/06/03 15:06:00 ERROR エラー発生
2007/06/03 15:06:00 WARN  警告 test
2007/06/03 15:06:00 INFO  情報 test
2007/06/03 15:06:00 DEBUG array (
2007/06/03 15:06:00 DEBUG   'hoge' =&gt; 12,
2007/06/03 15:06:00 DEBUG )

Log.php

ログファイル名とログ出力レベルは、定数指定。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?phpdefine('LOG_FILE', 'log/phpapp.log');define('LOG_LEVEL', 4); //0:none 1:error 2:waring 3:info 4:debugdefine('LOG_OUTPUT_PLACE', true); //true:クラス名と行番号を出力する false:出力しないclass Log {public static function debug($o) {if (LOG_LEVEL < 4) return;Log::output($o, "DEBUG", LOG_OUTPUT_PLACE ? debug_backtrace() : null);}public static function info($o) {if (LOG_LEVEL < 3) return;Log::output($o, "INFO ", LOG_OUTPUT_PLACE ? debug_backtrace() : null);}public static function warn($o) {if (LOG_LEVEL < 2) return;Log::output($o, "WARN ", LOG_OUTPUT_PLACE ? debug_backtrace() : null);}public static function error($o) {if (LOG_LEVEL < 1) return;Log::output($o, "ERROR", LOG_OUTPUT_PLACE ? debug_backtrace() : null);}public static function error_and_die($o) {if (LOG_LEVEL < 1) return;Log::output($o, "ERROR", debug_backtrace());die($o);}private static function output($o, $mode, $traces) {if (is_numeric($o) || is_string($o)) {Log::output_message($o, $mode, $traces);} else {Log::output_message(var_export($o, true), $mode, $traces);}}private static function output_message($str, $mode, $traces) {$now = date("Y/m/d H:i:s");$place = '';if ($traces && is_array($traces) && count($traces) > 0) {$trace = $traces[0];$place = "{$trace['file']}({$trace['line']})";}foreach (split("\n", $str) as $line) {error_log("$now $mode $place $line\r\n", 3, LOG_FILE);}}}?>
2010/05/31 ログを出力した位置を出力するように修正したバージョンに変更しました。
まあ、面白みもないものです。ログなので。 実は、debugとかerrorは、本当のところ関数として実装したかったのですが、別のモジュールが使っていたため、関数の重複定義になってしまった。 そのため、classのメソッドにしてしまいました。
PHP5では、名前空間(namespace)がサポートされた。これにより、クラス、変数、定数、関数を名前空間内に押し込めることができる。http://www.atmarkit.co.jp/flinux/special/php5/php5c.html
namespaceは、必要だろうと思ったら、PHP5でサポートされてるらしいです。 あと、__callで、publicメソッドを纏めてしまおうとしたんですが、__callはクラスメソッドに対しては機能しないようでした。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください