PageRenderTime 43ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/library/Jelly/Log/DefaultLogger.php

https://bitbucket.org/nosen/jelly2
PHP | 130 lines | 72 code | 16 blank | 42 comment | 5 complexity | 8fbd2aa53029422e93b08f34ae8e9f0d MD5 | raw file
  1. <?php namespace Jelly\Log;
  2. /**
  3. * ログクラス
  4. * timestamp書式のカスタマイズと、エラー検知用のsyslog出力
  5. *
  6. * @author kobari
  7. */
  8. class DefaultLogger extends \Zend_Log
  9. {
  10. /**
  11. * timestampの書式
  12. */
  13. private $_dateFormat = 'c';
  14. /**
  15. * Syslogに ERR 以上のログを出力するかどうか
  16. **/
  17. private $_enableSyslogAlert = false;
  18. /**
  19. * Constructor
  20. *
  21. * @param Zend_Log_Writer_Abstract $writer
  22. * @param string $dateFormat Format of Date method
  23. */
  24. public function __construct(\Zend_Log_Writer_Abstract $writer = null, $dateFormat = null)
  25. {
  26. // 指定があればtimestampの書式を上書き
  27. if (!empty($dateFormat)) {
  28. $this->_dateFormat = $dateFormat;
  29. }
  30. parent::__construct($writer);
  31. }
  32. /**
  33. * Log a message at a priority
  34. *
  35. * @param string $message Message to log
  36. * @param integer $priority Priority of message
  37. * @return void
  38. * @throws \Zend_Log_Exception
  39. */
  40. public function log($message, $priority, $extras = null)
  41. {
  42. // デフォルトの日付表記が見辛いので日付書式を上書き
  43. parent::setEventItem('timestamp', date($this->_dateFormat));
  44. // ここで、messageが例外オブジェクトの場合にエラーメッセージの組み立てを行う
  45. // 呼び元がcatchされたブロックの場合は、例外オブジェクトを渡す
  46. // 呼び元がcatchされたブロックでない場合は、例外を生成して渡す
  47. if ($priority <= self::ERR && $this->_enableSyslogAlert) {
  48. $arr_messages = $this->buildExceptionMessages($message, $priority);
  49. foreach ($arr_messages as $arr_message_index => $arr_message) {
  50. syslog(
  51. $priority,
  52. '[' . 'REPORT:'.$arr_message['errorlevel'].']' .
  53. ' ' . $arr_message['context'] .
  54. ' ' . $arr_message['loggingid'] . ':' . $arr_message['subno'] .
  55. ' ' . http_build_query($arr_message)
  56. );
  57. }
  58. }
  59. return parent::log($message, $priority, $extras);
  60. }
  61. /**
  62. * build exception message
  63. *
  64. * @param mixed $message ExceptionObject or string
  65. * @param integer $priority Priority
  66. * @return array
  67. * @throws \Zend_Log_Exception
  68. */
  69. public function buildExceptionMessages($message, $priority)
  70. {
  71. $arr_messages = array();
  72. $arr_message = array();
  73. $arr_message['priority'] = $priority;
  74. $arr_message['errorlevel'] = $this->_priorities[$priority];
  75. $arr_message['datetime'] = date("Y-m-d H:i:s");
  76. $arr_message['server_name'] = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : '-';
  77. $arr_message['server_addr'] = isset($_SERVER['SERVER_ADDR']) ? $_SERVER['SERVER_ADDR'] : '-';
  78. $arr_message['loggingid'] = md5(uniqid($arr_message['server_addr'].':'));
  79. $arr_message['subno'] = 0;
  80. $arr_message['class'] = '-';
  81. $arr_message['file'] = '-';
  82. $arr_message['line'] = 0;
  83. $arr_message['message'] = '';
  84. $arr_message['context'] = md5($arr_message['file'] . ":" . $arr_message['line']);
  85. if ($message instanceof Exception) {
  86. do {
  87. $arr_message['class'] = get_class($message);
  88. $arr_message['file'] = $message->getFile();
  89. $arr_message['line'] = $message->getLine();
  90. $arr_message['message'] = $message->getMessage();
  91. $arr_message['context'] = md5($arr_message['file'] . ":" . $arr_message['line']);
  92. $arr_messages[] = $arr_message;
  93. $arr_message['subno']++;
  94. } while($message = $message->getPrevious());
  95. }
  96. elseif (is_string($message)) {
  97. $arr_message['message'] = $message;
  98. $arr_message['context'] = md5($arr_message['file'] . ":" . $arr_message['line']);
  99. $arr_messages[] = $arr_message;
  100. }
  101. else {
  102. $arr_message['context'] = md5($arr_message['file'] . ":" . $arr_message['line']);
  103. $arr_messages[] = $arr_message;
  104. }
  105. return $arr_messages;
  106. }
  107. /**
  108. * syslog へのアラート出力を有効にする
  109. **/
  110. public function enableSyslogAlert()
  111. {
  112. $this->_enableSyslogAlert = true;
  113. }
  114. }