期望监听PHP Fatal error 级别的日志,请问怎么解决?

发布于 2022-09-11 18:15:37 字数 1778 浏览 18 评论 0

问题描述

使用的是swoft
php运行时会有error级别错误,会直接打印到屏幕或输出到swoole.log,期望能监听到如果是PHP Fatal error就监听到具体错误信息通过钉钉机器人直接推送消息到钉钉群中

自己尝试过哪些方法

1.在 App::error();主动写入error级别日志时,监听了相关信息

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)
base/vendor/swoft/framework/src/App.php

    /**
     * error级别日志
     *
     * @param mixed $message 日志信息
     * @param array $context 附加信息
     */
    public static function error($message, array $context = array())
    {
        self::dingdingLog($message, $context);
        self::getLogger()->error($message, $context);
    }
    
    /**
     * 发送钉钉消息
     * @param mixed $msg 信息
     * @param array $context 附加信息
     * @param bool $isMe
     * @throws \Exception
     */
    public static function dingdingLog($msg, array $context = array())
    {
        $serverIp = swoole_get_local_ip();
        $serverIp = empty($serverIp) ? '' : JsonHelper::encode($serverIp);

        $content = '### <font color="#dd0000">' . APP_NAME . '</font> Error Log' . PHP_EOL;
        $content .= '1. Message:' . $msg . PHP_EOL;
        if (!empty($context)) $content .= '2. Context:' . JsonHelper::encode($context) . PHP_EOL;
        $content .= '3. Time:' . date('Y-m-d H:i:s') . PHP_EOL;
        $content .= '4. Ip:' . $serverIp . PHP_EOL;

        $body = [
            'msgtype' => 'markdown',
            'markdown' => ['title' => 'Log Error', 'text' => $content],
        ];
        
        $client = new \Swoft\HttpClient\Client();
        $client->post(DING_DING_LOG_URL, ['body' => JsonHelper::encode($body), 'headers' => ['Content-Type' => 'application/json;charset=utf-8']]);
        return $client;
    }

你期待的结果是什么?实际看到的错误信息又是什么?

期望能把php运行的error错误也监听

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

你怎么这么可爱啊 2022-09-18 18:15:37

Swoft有异常处理啊,官网文档有说明:https://doc.swoft.org/master/...

你捕获到异常以后调用你封装的钉钉方法就可以了吧。


首先我们在app目录下创建一个Exception目录,建立一个异常捕获的处理控制器SwoftExceptionHandler

用到的注解@ExceptionHandler() class注解,声明当前类是异常处理类 @Handler() method注解,需要捕获的异常类;

例如Exception::class为php自带或者自己定义的异常处理类

/**
 * @ExceptionHandler()
 * @package App\Exception
 */
class SwoftExceptionHandler
{
    /**
     * @Handler(Exception::class)
     *
     * @param Response   $response
     * @param \Throwable $throwable
     *
     * @return Response
     */
    public function handlerException(Response $response, \Throwable $throwable)
    {
        $file      = $throwable->getFile();
        $line      = $throwable->getLine();
        $code      = $throwable->getCode();
        $exception = $throwable->getMessage();

        $data = ['msg' => $exception, 'file' => $file, 'line' => $line, 'code' => $code];
        App::error(json_encode($data));
        return $response->json($data);
    }
}

配置能被Swoft扫描到

config/properties/app.php中的beanScan中增加App\Exception, 配置如下

return [
    'version'      => '1.0',
    'autoInitBean' => true,
    'bootScan'     => [
        'App\Commands',
    ],
    'beanScan'     => [
        'App\Controllers',
        'App\Models',
        'App\Middlewares',
        'App\Exception',
    ],
    'env'          => 'Base',
    'db'           => require __DIR__ . DS . 'db.php',
    'cache'        => require __DIR__ . DS . 'cache.php',
];

修改完成后,重新启动swoft即可。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文