Laravel 5.6+ 使用 MongoDB 儲存框架日誌

Wi1dcard發表於2019-01-13

網上的文章普遍是 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.

相關文章