網上的文章普遍是 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 協議》,轉載必須註明作者和本文連結