/library/Jelly/Log/DefaultLogger.php
PHP | 130 lines | 72 code | 16 blank | 42 comment | 5 complexity | 8fbd2aa53029422e93b08f34ae8e9f0d MD5 | raw file
- <?php namespace Jelly\Log;
- /**
- * ログクラス
- * timestamp書式のカスタマイズと、エラー検知用のsyslog出力
- *
- * @author kobari
- */
- class DefaultLogger extends \Zend_Log
- {
- /**
- * timestampの書式
- */
- private $_dateFormat = 'c';
- /**
- * Syslogに ERR 以上のログを出力するかどうか
- **/
- private $_enableSyslogAlert = false;
- /**
- * Constructor
- *
- * @param Zend_Log_Writer_Abstract $writer
- * @param string $dateFormat Format of Date method
- */
- public function __construct(\Zend_Log_Writer_Abstract $writer = null, $dateFormat = null)
- {
- // 指定があればtimestampの書式を上書き
- if (!empty($dateFormat)) {
- $this->_dateFormat = $dateFormat;
- }
- parent::__construct($writer);
- }
- /**
- * Log a message at a priority
- *
- * @param string $message Message to log
- * @param integer $priority Priority of message
- * @return void
- * @throws \Zend_Log_Exception
- */
- public function log($message, $priority, $extras = null)
- {
- // デフォルトの日付表記が見辛いので日付書式を上書き
- parent::setEventItem('timestamp', date($this->_dateFormat));
- // ここで、messageが例外オブジェクトの場合にエラーメッセージの組み立てを行う
- // 呼び元がcatchされたブロックの場合は、例外オブジェクトを渡す
- // 呼び元がcatchされたブロックでない場合は、例外を生成して渡す
- if ($priority <= self::ERR && $this->_enableSyslogAlert) {
- $arr_messages = $this->buildExceptionMessages($message, $priority);
- foreach ($arr_messages as $arr_message_index => $arr_message) {
- syslog(
- $priority,
- '[' . 'REPORT:'.$arr_message['errorlevel'].']' .
- ' ' . $arr_message['context'] .
- ' ' . $arr_message['loggingid'] . ':' . $arr_message['subno'] .
- ' ' . http_build_query($arr_message)
- );
- }
- }
- return parent::log($message, $priority, $extras);
- }
- /**
- * build exception message
- *
- * @param mixed $message ExceptionObject or string
- * @param integer $priority Priority
- * @return array
- * @throws \Zend_Log_Exception
- */
- public function buildExceptionMessages($message, $priority)
- {
- $arr_messages = array();
- $arr_message = array();
- $arr_message['priority'] = $priority;
- $arr_message['errorlevel'] = $this->_priorities[$priority];
- $arr_message['datetime'] = date("Y-m-d H:i:s");
- $arr_message['server_name'] = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : '-';
- $arr_message['server_addr'] = isset($_SERVER['SERVER_ADDR']) ? $_SERVER['SERVER_ADDR'] : '-';
- $arr_message['loggingid'] = md5(uniqid($arr_message['server_addr'].':'));
- $arr_message['subno'] = 0;
- $arr_message['class'] = '-';
- $arr_message['file'] = '-';
- $arr_message['line'] = 0;
- $arr_message['message'] = '';
- $arr_message['context'] = md5($arr_message['file'] . ":" . $arr_message['line']);
- if ($message instanceof Exception) {
- do {
- $arr_message['class'] = get_class($message);
- $arr_message['file'] = $message->getFile();
- $arr_message['line'] = $message->getLine();
- $arr_message['message'] = $message->getMessage();
- $arr_message['context'] = md5($arr_message['file'] . ":" . $arr_message['line']);
- $arr_messages[] = $arr_message;
- $arr_message['subno']++;
- } while($message = $message->getPrevious());
- }
- elseif (is_string($message)) {
- $arr_message['message'] = $message;
- $arr_message['context'] = md5($arr_message['file'] . ":" . $arr_message['line']);
- $arr_messages[] = $arr_message;
- }
- else {
- $arr_message['context'] = md5($arr_message['file'] . ":" . $arr_message['line']);
- $arr_messages[] = $arr_message;
- }
- return $arr_messages;
- }
-
- /**
- * syslog へのアラート出力を有効にする
- **/
- public function enableSyslogAlert()
- {
- $this->_enableSyslogAlert = true;
- }
- }