thinkphp框架mongodb日志系统搭建

1、服务器mongodb安装(下载地址https://www.mongodb.com/try/download/community)

yum install -y https://repo.mongodb.org/yum/redhat/7/mongodb-org/6.0/x86_64/RPMS/mongodb-org-server-6.0.1-1.el7.x86_64.rpm
启动服务

systemctl start mongod.service
查询服务状态

systemctl status mongod.service
停止服务

systemctl stop mongod.service
设置服务自启动

systemctl enable mongod.service
停止服务自启动

systemctl idsable mongod.service
2、php mongodb扩展安装

用宝塔装的,这里有问题,mongo是强类型数据库,写入时间格式不能是普通字符串要经过mongoDate类处理才能正常筛选时间,而我装的扩展力不存在这个类,所以这里退而求其次存储时间戳,往后对于日志的查看稍有不便,暂时没时间折腾了,先这样

填坑,MongoDate类不存在是因为工具迭代了,重点有两个,一是只接受毫秒时间戳,第二个utc时区转换为本地时区

    /**
     * 获取当前mongo日期类型对象(utc时间加八小时就是当前时间)
     */
    if (!function_exists('getMongoDateTime')) {
        function getMongoDateTime()
        {
            list($t1, $t2) = explode(' ', microtime());
            $million_second = (float)sprintf('%.0f', (floatval($t1 + 3600 * 8) + floatval($t2)) * 1000);
            return new \MongoDB\BSON\UTCDateTime($million_second);
        }
    }

3、安装mongodb依赖

composer require topthink/think-mongo=2.0.*

4、代码配置
数据库连接配置,/config/database.php

   'mongo' => [
        // 数据库类型
        'type'           => '\think\mongo\Connection',
        // 设置查询类
        'query'			 => '\think\mongo\Query',
        // 服务器地址
        'hostname'       => '127.0.0.1',
        // 集合名
        'database'       => 'wms',
        // 用户名
        'username'       => '',
        // 密码
        'password'       => '',
        // 端口
        'hostport'       => '27017',
    ],

tp框架全局异常接管配置/config/app.php

'exception_handle' => '\\app\\common\\HttpException'
异常接管类

<?php

namespace app\common;

use think\Request;

class HttpException extends \think\exception\Handle
{
    public function render(\Exception $e)
    {
        $param = \think\facade\Request::param();
        $url = \think\facade\Request::url();
        \app\common\model\MongoError::mongoError($e->getMessage(), $e->getTrace(), $e->getFile(), $e->getLine(), $url, $param);
        // 其他错误交给系统处理
        return parent::render($e);
    }
}

mongo集合所对应的模型类

<?php

namespace app\common\model;

use think\Model;

class MongoError extends Model
{
    protected $connection = 'mongo';
    protected $table = 'error';

    /**
     * Desc:Desc:写入error日志
     * Author:glt 2022/9/17 14:16
     * @param $msg
     * @param $trace
     * @param $file
     * @param $line
     * @param $url
     * @param $param
     * @return int|string
     */
    public static function mongoError($msg, $trace, $file, $line, $url, $param)
    {
        return self::insert(['msg' => $msg, 'trace' => $trace, 'file' => $file, 'line' => $line, 'param' => $param, 'url' => $url, 'add_time' => time()]);
    }
}

至此,完工。项目中任意一处代码报错都会触发异常,将异常信息保存到mongo中,附带请求地址、错误信息、请求参数等,目的是更方便更精准的定位bug,如果再加上一个微信或者短信提示,那就更加妙不可言了。推荐一个微信机器人工具,可以自动发微信消息的神器 https://github.com/wxext/wxext

posted @ 2022-09-17 15:33  gltttt  阅读(490)  评论(0)    收藏  举报