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.
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 6

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

6年前 评论

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

6年前 评论

@Wi1dcard 写到文件不好吗

6年前 评论

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

6年前 评论

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

6年前 评论

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

6年前 评论

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