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.
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 6

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

5年前 评论

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

5年前 评论

@Wi1dcard 写到文件不好吗

5年前 评论

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

5年前 评论

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

5年前 评论

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

5年前 评论

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