Laravel 5.6+ 使用 MongoDB 存储框架日志

网上的文章普遍是 Laravel 5.5 版本,而日志系统在 5.6 版本升级时进行了部分改动,原有方法基本都失效了。本文根据 Laravel 5.6 文档的指引,实现使用 MongoDB 存储框架日志。

0x00 准备

MongoDB Engine

首先,安装 MongoDB,参见 官方文档

MongoDB Driver(PHP Extension)

其次,安装 PHP mongodb 扩展,参见 官方文档

GitHub:https://github.com/mongodb/mongo-php-drive...

MongoDB Library(Wrapper Package)

最后,通常情况下,你还需要一个高度封装的包装库;使用 MongoDB 官方提供即可,参见 官方文档

GitHub:https://github.com/mongodb/mongo-php-libra...

0x01 配置

打开 config/logging.php,修改其 channels

return [
    // ...

    'channels' => [
        // ...

        'mongodb' => [ // 此处可以根据需求调整
            'driver' => 'custom', // 此处必须为 `custom`
            'via' => CreateCustomLogger::class, // 当 `driver` 设置为 custom 时,使用 `via` 配置项所指向的工厂类创建 logger

            // 以下 env 配置名可以根据需求调整
            'server' => env('LOG_MONGO_SERVER', 'mongodb://localhost:27017'),
            'database' => env('LOG_MONGO_DB', 'logs'),
            'collection' => env('LOG_MONGO_COLLECTION', 'logs'),
            'level' => env('LOG_MONGO_LEVEL', 'debug'), // 日志级别
        ],
    ],
];

接着你需要将 default 修改为 mongodb,也可以修改 .env

return [
    'default' => env('LOG_CHANNEL', 'mongodb'), // 我直接将默认值修改为 mongodb,也就是 channels 内新增的配置项。

    // ...
]

0x02 实现

找个合适的位置(我使用 app/Logging)创建 CreateCustomLogger.php

use Monolog\Logger;
use Monolog\Handler\MongoDBHandler;
use Monolog\Processor\WebProcessor;

class CreateCustomLogger
{
    /**
     * Create a custom Monolog instance.
     *
     * @param  array  $config
     * @return \Monolog\Logger
     */
    public function __invoke(array $config)
    {
        $logger = new Logger(''); // 创建 Logger

        $handler = new MongoDBHandler( // 创建 Handler
            new \MongoDB\Client($config['server']), // 创建 MongoDB 客户端(依赖 mongodb/mongodb)
            $config['database'],
            $config['collection']
        );

        $handler->setLevel($config['level']);

        $logger->pushHandler($handler); // 挂载 Handler
        $logger->pushProcessor(new WebProcessor($_SERVER)); // 记录额外的请求信息

        return $logger;
    }
}

0x03 完成

好了,接下来可以执行 php artisan tinker,输入 Log::warning(...) 测试你的成果了。

别忘记把 MongoDB 服务启动。

本作品采用《CC 协议》,转载必须注明作者和本文链接
Former WinForm and PHP engineer. Now prefer Golang and Rust, and mainly working on DevSecOps and Kubernetes.
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 6

出于什么原因 要用MongoDB存框架日志的

5年前 评论

@wujunze 一种方式而已。优点是相比 MySQL 更适合这类大量低价值写操作;缺点也很明显,分析起来比 ELK 难度大的多。

5年前 评论

@Wi1dcard 写到文件不好吗

5年前 评论

@wujunze 无状态化应用肯定要有单独的日志采集服务的,写文件明显不适合生产环境。当然,简易快速的方式还是写文件,看你自己的需求了。

5年前 评论

mongodb 在安全方面翻车次数太多了,极端不敢用他

5年前 评论

@BradStevens 业务数据的确不敢,印象中之前看过另一个小众数据库的故事,与Mongo相爱相杀,然而还是被Mongo的营销打败了,尽管代码质量比Mongo高无数倍。

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
67
粉丝
590
喜欢
1235
收藏
1133
排名:13
访问:32.4 万
私信
所有博文
社区赞助商