日志处理

Logger

EasySwoole\Trace\Logger是easyswoole默认的日志处理类,我们只需要直接调用即可使用:

  1. function index()
  2. {
  3. \EasySwoole\EasySwoole\Logger::getInstance()->log('日志内容');//将记录日志
  4. \EasySwoole\EasySwoole\Logger::getInstance()->console('控制器输出内容');//将记录日志+输出到控制台
  5. \EasySwoole\EasySwoole\Logger::getInstance()->logWithLocation('日志内容+文件来源');//将记录日志+调用该方法的文件地址和文件行数
  6. \EasySwoole\EasySwoole\Logger::getInstance()->consoleWithLocation('控制器输出内容+文件来源');//将记录日志+输出到控制台+调用该方法的文件地址和文件行数
  7. $this->writeJson(200, [], 'success');
  8. }

将输出/记录以下内容:

  1. [2019-04-12 10:04:18][default]控制器输出内容
  2. [2019-04-12 10:04:18][default][file:/www/easyswoole/easyswoole-test/App/HttpController/Index.php][line:26]控制器输出内容

Trigger

\EasySwoole\EasySwoole\Trigger触发器,用于主动触发错误或者异常而不中断程序继续执行。
例如在控制器的onException中,我们可以记录错误异常,然后输出其他内容,不让系统终端运行,不让用户发觉真实错误.

  1. function onException(\Throwable $throwable): void
  2. {
  3. //记录错误异常日志,等级为Exception
  4. Trigger::getInstance()->throwable($throwable);
  5. //记录错误信息,等级为FatalError
  6. Trigger::getInstance()->error($throwable->getMessage().'666');
  7. //直接给前端响应500并输出系统繁忙
  8. $this->response()->withStatus(Status::CODE_INTERNAL_SERVER_ERROR);
  9. $this->response()->write('系统繁忙,请稍后再试 ');
  10. }

自定义logger

如果你不想使用框架默认的记录日志逻辑,可以自定义logger的实现.
例如,框架的记录日志是记录到文件,我们可以改成记录到数据库,或者直接把错误发送短信到手机上(只是举例).

新增文件App/Utility/Logger.php:

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Tioncico
  5. * Date: 2019/3/18 0018
  6. * Time: 14:56
  7. */
  8. namespace App\Utility;
  9. use EasySwoole\Trace\AbstractInterface\LoggerInterface;
  10. class Logger implements LoggerInterface
  11. {
  12. /**
  13. * 打印到控制台并记录日志
  14. * console
  15. * @param string $str
  16. * @param null $category
  17. * @param bool $saveLog
  18. * @return string|null
  19. * @author Tioncico
  20. * Time: 14:57
  21. */
  22. public function console(string $str, $category = null, $saveLog = true): ?string
  23. {
  24. //自定义逻辑,这里只echo了字符串,我们可以参考框架本身的,再调用一下log记录一下
  25. echo $str;
  26. return $str;//必须返回字符串回去
  27. }
  28. /**
  29. * 自定义进行日志存储,比如存到数据库,存到文件,或者请求其他地方存储
  30. * log
  31. * @param string $str
  32. * @param null $logCategory
  33. * @param int|null $timestamp
  34. * @return string|null
  35. * @author Tioncico
  36. * Time: 14:56
  37. */
  38. public function log(string $str, $logCategory = null, int $timestamp = null): ?string
  39. {
  40. //自定义逻辑,例如存储到数据库,短信发送错误数据到手机等等
  41. file_put_contents(getcwd()."/test.log",$str.PHP_EOL,FILE_APPEND);
  42. return $str;//必须返回字符串回去
  43. }
  44. }

EasySwooleEvent.php中的initialize方法进行注册:

  1. <?php
  2. public static function initialize()
  3. {
  4. // TODO: Implement initialize() method.
  5. date_default_timezone_set('Asia/Shanghai');
  6. Di::getInstance()->set(SysConst::LOGGER_HANDLER,\App\Utility\Logger::class);
  7. }

调用:

  1. function index()
  2. {
  3. \EasySwoole\EasySwoole\Logger::getInstance()->log('日志内容');//将记录日志
  4. \EasySwoole\EasySwoole\Logger::getInstance()->console('控制器输出内容');//将记录日志+输出到控制台
  5. $this->writeJson(200, [], 'success');
  6. }

自定义Trigger

同样,如果不想使用框架自带的Trigger处理,也可以自行实现
我们需要通过实现EasySwoole\Trace\AbstractInterface\TriggerInterface接口进行实现处理类:
新增文件App/Utility/Trigger.php

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Tioncico
  5. * Date: 2019/3/18 0018
  6. * Time: 14:34
  7. */
  8. namespace App\Utility;
  9. use EasySwoole\EasySwoole\Logger;
  10. use EasySwoole\Trace\AbstractInterface\TriggerInterface;
  11. use EasySwoole\Trace\Bean\Location;
  12. class Trigger implements TriggerInterface
  13. {
  14. public function error($msg, int $errorCode = E_USER_ERROR, Location $location = null)
  15. {
  16. Logger::getInstance()->console('这是自定义输出的错误:'.$msg);
  17. // TODO: Implement error() method.
  18. }
  19. public function throwable(\Throwable $throwable)
  20. {
  21. Logger::getInstance()->console('这是自定义输出的异常:'.$throwable->getMessage());
  22. // TODO: Implement throwable() method.
  23. }
  24. }

EasySwooleEvent.phpinitialize方法中进行注入:

  1. public static function initialize()
  2. {
  3. // TODO: Implement initialize() method.
  4. date_default_timezone_set('Asia/Shanghai');
  5. Di::getInstance()->set(SysConst::TRIGGER_HANDLER,\App\Utility\Trigger::class);
  6. }

调用:

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Tioncico
  5. * Date: 2019/4/11 0011
  6. * Time: 14:40
  7. */
  8. namespace App\HttpController;
  9. use EasySwoole\EasySwoole\Trigger;
  10. use EasySwoole\Http\AbstractInterface\Controller;
  11. use EasySwoole\Http\Message\Status;
  12. class Index extends Controller
  13. {
  14. function index()
  15. {
  16. $a = new a();//new一个不存在的类去触发
  17. $this->writeJson(200, [], 'success');
  18. }
  19. function onException(\Throwable $throwable): void
  20. {
  21. //记录错误异常日志,等级为Exception
  22. Trigger::getInstance()->throwable($throwable);
  23. //记录错误信息,等级为FatalError
  24. Trigger::getInstance()->error($throwable->getMessage() . '666');
  25. //直接给前端响应500并输出系统繁忙
  26. $this->response()->withStatus(Status::CODE_INTERNAL_SERVER_ERROR);
  27. $this->response()->write('系统繁忙,请稍后再试 ');
  28. }
  29. }