OSDN Git Service

19c0a32fc500172a37b5d641adead836219a5345
[ethna/ethna.git] / class / Plugin / Logwriter.php
1 <?php
2 // vim: foldmethod=marker
3 /**
4  *  Logwriter.php
5  *
6  *  @author     Masaki Fujimoto <fujimoto@php.net>
7  *  @license    http://www.opensource.org/licenses/bsd-license.php The BSD License
8  *  @package    Ethna
9  *  @version    $Id$
10  */
11
12 // {{{ Ethna_Plugin_Logwriter
13 /**
14  *  ログ出力基底クラス
15  *
16  *  @author     Masaki Fujimoto <fujimoto@php.net>
17  *  @access     public
18  *  @package    Ethna
19  */
20 class Ethna_Plugin_Logwriter
21 {
22     /**#@+
23      *  @access private
24      */
25
26     /** @var    string  ログアイデンティティ文字列 */
27     var $ident;
28
29     /** @var    int     ログファシリティ */
30     var $facility;
31
32     /** @var    int     ログオプション */
33     var $option;
34
35     /** @var    bool    バックトレースが取得可能かどうか */
36     var $have_backtrace;
37
38     /** @var    array   ログレベル名テーブル */
39     var $level_name_table = array(
40         LOG_EMERG   => 'EMERG',
41         LOG_ALERT   => 'ALERT',
42         LOG_CRIT    => 'CRIT',
43         LOG_ERR     => 'ERR',
44         LOG_WARNING => 'WARNING',
45         LOG_NOTICE  => 'NOTICE',
46         LOG_INFO    => 'INFO',
47         LOG_DEBUG   => 'DEBUG',
48     );
49
50     /**#@-*/
51
52     /**
53      *  Logwriterクラスのコンストラクタ
54      *
55      *  @access public
56      *  @param  string  $log_ident      ログアイデンティティ文字列(プロセス名等)
57      *  @param  int     $log_facility   ログファシリティ
58      *  @param  string  $log_file       ログ出力先ファイル名(LOG_FILEオプションが指定されている場合のみ)
59      *  @param  int     $log_option     ログオプション(LOG_FILE,LOG_FUNCTION...)
60      */
61     function Ethna_Plugin_Logwriter()
62     {
63     }
64
65     /**
66      *  ログオプションを設定する
67      *
68      *  @access public
69      *  @param  int     $option     ログオプション(LOG_FILE,LOG_FUNCTION...)
70      */
71     function setOption($option)
72     {
73         $this->ident = $option['ident'];
74         $this->facility = $option['facility'];
75         $this->option = $option;
76         $this->have_backtrace = function_exists('debug_backtrace');
77     }
78
79     /**
80      *  ログ出力を開始する
81      *
82      *  @access public
83      */
84     function begin()
85     {
86     }
87
88     /**
89      *  ログを出力する
90      *
91      *  @access public
92      *  @param  int     $level      ログレベル(LOG_DEBUG, LOG_NOTICE...)
93      *  @param  string  $message    ログメッセージ(+引数)
94      */
95     function log($level, $message)
96     {
97     }
98
99     /**
100      *  ログ出力を終了する
101      *
102      *  @access public
103      */
104     function end()
105     {
106     }
107
108     /**
109      *  ログアイデンティティ文字列を取得する
110      *
111      *  @access public
112      *  @return string  ログアイデンティティ文字列
113      */
114     function getIdent()
115     {
116         return $this->ident;
117     }
118
119     /**
120      *  ログレベルを表示文字列に変換する
121      *
122      *  @access private
123      *  @param  int     $level  ログレベル(LOG_DEBUG,LOG_NOTICE...)
124      *  @return string  ログレベル表示文字列(LOG_DEBUG→"DEBUG")
125      */
126     function _getLogLevelName($level)
127     {
128         if (isset($this->level_name_table[$level]) == false) {
129             return null;
130         }
131         return $this->level_name_table[$level];
132     }
133
134     /**
135      *  ログ出力箇所の情報(関数名/ファイル名等)を取得する
136      *
137      *  @access private
138      *  @return array   ログ出力箇所の情報
139      */
140     function _getBacktrace()
141     {
142         $skip_method_list = array(
143             array('ethna', 'raise'),
144             array(null, 'raiseerror'),
145             array(null, 'handleerror'),
146             array('ethna_logger', null),
147             array('ethna_plugin_logwriter', null),
148             array('ethna_error', null),
149             array('ethna_apperror', null),
150             array('ethna_actionerror', null),
151             array('ethna_backend', 'log'),
152             array(null, 'ethna_error_handler'),
153             array(null, 'trigger_error'),
154         );
155
156         if ($this->have_backtrace == false) {
157             return null;
158         }
159
160         $bt = debug_backtrace();
161         $i = 0;
162         while ($i < count($bt)) {
163             if (isset($bt[$i]['class']) == false) {
164                 $bt[$i]['class'] = null;
165             }
166             $skip = false;
167
168             // メソッドスキップ処理
169             foreach ($skip_method_list as $method) {
170                 $class = $function = true;
171                 if ($method[0] != null) {
172                     $class = preg_match("/^$method[0]/i", $bt[$i]['class']);
173                 }
174                 if ($method[1] != null) {
175                     $function = preg_match("/^$method[1]/i", $bt[$i]['function']);
176                 }
177                 if ($class && $function) {
178                     $skip = true;
179                     break;
180                 }
181             }
182
183             if ($skip) {
184                 $i++;
185             } else {
186                 break;
187             }
188         }
189
190         $c =& Ethna_Controller::getInstance();
191         $basedir = $c->getBasedir();
192
193         $function = sprintf("%s.%s", isset($bt[$i]['class']) ? $bt[$i]['class'] : 'global', $bt[$i]['function']);
194
195         $file = $bt[$i]['file'];
196         if (strncmp($file, $basedir, strlen($basedir)) == 0) {
197             $file = substr($file, strlen($basedir));
198         }
199         if (strncmp($file, ETHNA_BASE, strlen(ETHNA_BASE)) == 0) {
200             $file = preg_replace('#^/+#', '', substr($file, strlen(ETHNA_BASE)));
201         }
202         $line = $bt[$i]['line'];
203         return array('function' => $function, 'pos' => sprintf('%s:%s', $file, $line));
204     }
205 }
206 // }}}
207 ?>