Log.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <?php
  2. namespace Man\Core\Lib;
  3. /**
  4. *
  5. * 日志类
  6. *
  7. * @author walkor <worker-man@qq.com>
  8. */
  9. class Log
  10. {
  11. /**
  12. * 能捕获的错误抛出的异常的错误码
  13. * @var int
  14. */
  15. const CATCHABLE_ERROR = 505;
  16. /**
  17. * 初始化
  18. * @return bool
  19. */
  20. public static function init()
  21. {
  22. set_error_handler(array('\Man\Core\Lib\Log', 'errHandle'), E_RECOVERABLE_ERROR | E_USER_ERROR);
  23. return self::checkWriteable();
  24. }
  25. /**
  26. * 检查log目录是否可写
  27. * @return bool
  28. */
  29. public static function checkWriteable()
  30. {
  31. $ok = true;
  32. if(!is_dir(WORKERMAN_LOG_DIR))
  33. {
  34. // 检查log目录是否可读
  35. umask(0);
  36. if(@mkdir(WORKERMAN_LOG_DIR, 0777) === false)
  37. {
  38. $ok = false;
  39. }
  40. @chmod(WORKERMAN_LOG_DIR, 0777);
  41. }
  42. if(!is_readable(WORKERMAN_LOG_DIR) || !is_writeable(WORKERMAN_LOG_DIR))
  43. {
  44. $ok = false;
  45. }
  46. if(!$ok)
  47. {
  48. $pad_length = 26;
  49. Master::notice(WORKERMAN_LOG_DIR." Need to have read and write permissions\tWorkerman start fail");
  50. exit("------------------------LOG------------------------\n".str_pad(WORKERMAN_LOG_DIR, $pad_length) . "\033[31;40m [NOT READABLE/WRITEABLE] \033[0m\n\n\033[31;40mDirectory ".WORKERMAN_LOG_DIR." Need to have read and write permissions\033[0m\n\n\033[31;40mWorkerman start fail\033[0m\n\n");
  51. }
  52. }
  53. /**
  54. * 添加日志
  55. * @param string $msg
  56. * @return void
  57. */
  58. public static function add($msg)
  59. {
  60. $log_dir = WORKERMAN_LOG_DIR. '/'.date('Y-m-d');
  61. umask(0);
  62. // 没有log目录创建log目录
  63. if(!is_dir($log_dir))
  64. {
  65. mkdir($log_dir, 0777, true);
  66. }
  67. if(!is_readable($log_dir))
  68. {
  69. return false;
  70. }
  71. $log_file = $log_dir . "/server.log";
  72. file_put_contents($log_file, date('Y-m-d H:i:s') . " " . $msg . "\n", FILE_APPEND);
  73. }
  74. /**
  75. * 错误日志捕捉函数
  76. * @param int $errno
  77. * @param string $errstr
  78. * @param string $errfile
  79. * @param int $errline
  80. * @return false
  81. */
  82. public static function errHandle($errno, $errstr, $errfile, $errline)
  83. {
  84. $err_type_map = array(
  85. E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR',
  86. E_USER_ERROR => 'E_USER_ERROR',
  87. );
  88. switch ($errno)
  89. {
  90. case E_RECOVERABLE_ERROR:
  91. case E_USER_ERROR:
  92. $msg = "{$err_type_map[$errno]} $errstr";
  93. self::add($msg);
  94. //trigger_error($errstr);
  95. throw new \Exception($msg, self::CATCHABLE_ERROR);
  96. break;
  97. default :
  98. return false;
  99. }
  100. }
  101. }