日志处理

Logger

在easyswoole3.2.3版本之后,easyswoole的默认日志处理类分离成了组件形式,组件地址:https://github.com/easy-swoole/log

自定义日志

首先要定义好一个日志模板,需要继承并实现\EasySwoole\Log\LoggerInterface,如下:

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: root
  5. * Date: 19-11-13
  6. * Time: 上午11:00
  7. */
  8. namespace App\Logger;
  9. use EasySwoole\Log\LoggerInterface;
  10. class Logger implements LoggerInterface
  11. {
  12. function log(?string $msg, int $logLevel = self::LOG_LEVEL_INFO, string $category = 'DEBUG'): string
  13. {
  14. // TODO: Implement log() method.
  15. $date = date('Y-m-d H:i:s');
  16. $levelStr = $this->levelMap($logLevel);
  17. $filePath = EASYSWOOLE_LOG_DIR."/".date('Y-m-d').".log";
  18. $str = "[{$date}][{$category}][{$levelStr}] : [{$msg}]\n";
  19. file_put_contents($filePath,"{$str}",FILE_APPEND|LOCK_EX);
  20. return $str;
  21. }
  22. function console(?string $msg, int $logLevel = self::LOG_LEVEL_INFO, string $category = 'DEBUG')
  23. {
  24. // TODO: Implement console() method.
  25. $date = date('Y-m-d H:i:s');
  26. $levelStr = $this->levelMap($logLevel);
  27. $temp = $this->colorString("[{$date}][{$category}][{$levelStr}] : [{$msg}]",$logLevel)."\n";
  28. fwrite(STDOUT,$temp);
  29. }
  30. private function colorString(string $str,int $logLevel)
  31. {
  32. switch($logLevel) {
  33. case self::LOG_LEVEL_INFO:
  34. $out = "[42m";
  35. break;
  36. case self::LOG_LEVEL_NOTICE:
  37. $out = "[43m";
  38. break;
  39. case self::LOG_LEVEL_WARNING:
  40. $out = "[45m";
  41. break;
  42. case self::LOG_LEVEL_ERROR:
  43. $out = "[41m";
  44. break;
  45. default:
  46. $out = "[42m";
  47. break;
  48. }
  49. return chr(27) . "$out" . "{$str}" . chr(27) . "[0m";
  50. }
  51. private function levelMap(int $level)
  52. {
  53. switch ($level)
  54. {
  55. case self::LOG_LEVEL_INFO:
  56. return 'INFO';
  57. case self::LOG_LEVEL_NOTICE:
  58. return 'NOTICE';
  59. case self::LOG_LEVEL_WARNING:
  60. return 'WARNING';
  61. case self::LOG_LEVEL_ERROR:
  62. return 'ERROR';
  63. default:
  64. return 'UNKNOWN';
  65. }
  66. }
  67. }

EasySwooleEvent 中的 initialize 方法注入自定义日志处理, 如下:

  1. public static function initialize()
  2. {
  3. // TODO: Implement initialize() method.
  4. Di::getInstance()->set(SysConst::LOGGER_HANDLER, new \App\Logger\Logger());
  5. }

logger调用方法

  1. use use EasySwoole\EasySwoole\Logger;
  2. Logger::getInstance()->log('log level info',Logger::LOG_LEVEL_INFO,'DEBUG');//记录info级别日志//例子后面2个参数默认值
  3. Logger::getInstance()->log('log level notice',Logger::LOG_LEVEL_NOTICE,'DEBUG2');//记录notice级别日志//例子后面2个参数默认值
  4. Logger::getInstance()->console('console',Logger::LOG_LEVEL_INFO,'DEBUG');//记录info级别日志并输出到控制台
  5. Logger::getInstance()->info('log level info');//记录info级别日志并输出到控制台
  6. Logger::getInstance()->notice('log level notice');//记录notice级别日志并输出到控制台
  7. Logger::getInstance()->waring('log level waring');//记录waring级别日志并输出到控制台
  8. Logger::getInstance()->error('log level error');//记录error级别日志并输出到控制台
  9. Logger::getInstance()->onLog()->set('myHook',function ($msg,$logLevel,$category){
  10. //增加日志写入之后的回调函数
  11. });

::: warning 注意,在非框架中使用,例如是单元测试脚本,请执行 EasySwoole\EasySwoole\Core::getInstance()->initialize(); 用于初始化日志 :::

将输出/记录以下内容:

  1. [2019-06-01 21:10:25][DEBUG][INFO] : [1]
  2. [2019-06-01 21:10:25][DEBUG][INFO] : [2]
  3. [2019-06-01 21:10:25][DEBUG][INFO] : [3]
  4. [2019-06-01 21:10:25][DEBUG][NOTICE] : [4]
  5. [2019-06-01 21:10:25][DEBUG][WARNING] : [5]
  6. [2019-06-01 21:10:25][DEBUG][ERROR] : [6]
  7. [2019-06-01 21:23:27][DEBUG][INFO] : [log level info]
  8. [2019-06-01 21:23:27][DEBUG2][NOTICE] : [log level notice]
  9. [2019-06-01 21:23:27][DEBUG][INFO] : [console]
  10. [2019-06-01 21:23:27][DEBUG][INFO] : [log level info]
  11. [2019-06-01 21:23:27][DEBUG][NOTICE] : [log level notice]
  12. [2019-06-01 21:23:27][DEBUG][WARNING] : [log level waring]
  13. [2019-06-01 21:23:27][DEBUG][ERROR] : [log level error]

::: warning 在新版logger处理方案中,新增了 LOG_LEVEL_INFO = 1LOG_LEVEL_NOTICE = 2LOG_LEVEL_WARNING = 3LOG_LEVEL_ERROR = 4,4个日志等级,有助于更好的区分日志 :::

Trigger

\EasySwoole\EasySwoole\Trigger触发器,用于主动触发错误或者异常而不中断程序继续执行。

在easyswoole3.2.3版本之后,easyswoole的默认Trigger类分离成了组件形式,组件地址:https://github.com/easy-swoole/trigger

例如在控制器的onException中,我们可以记录错误异常,然后输出其他内容,不让系统终端运行,不让用户发觉真实错误.

  1. use EasySwoole\EasySwoole\Trigger;
  2. //记录错误异常日志,等级为Exception
  3. Trigger::getInstance()->throwable($throwable);
  4. //记录错误信息,等级为FatalError
  5. Trigger::getInstance()->error($throwable->getMessage().'666');
  6. Trigger::getInstance()->onError()->set('myHook',function (){
  7. //当发生error时新增回调函数
  8. });
  9. Trigger::getInstance()->onException()->set('myHook',function (){
  10. });

日志中心

比如,会有想把数据往日志中心推送,或者是最TCP日志推送,那么,可以新增onLog回调,然后把日志信息,推送到日志中心。