• 日志处理
    • Logger
    • Trigger
    • 自定义logger
    • 自定义Trigger

    日志处理

    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. }