如何在Laravel应用中使用Monolog的ElasticSearchHandler实现日志记录
将Monolog自带的ElasticSearch处理程序与格式化器作为自定义日志通道接入Laravel的实现过程,并不像Laravel官方文档描述的那样简单,完整可落地的实现步骤如下:
1 安装依赖包
Monolog的ElasticSearch处理程序依赖Elastic官方PHP客户端,先通过Composer安装对应版本(注意客户端大版本需和你部署的ElasticSearch服务端大版本保持一致):composer require elasticsearch/elasticsearch
2 新增日志通道配置
打开config/logging.php文件,在channels数组中添加自定义ES通道配置:
'elasticsearch' => [ 'driver' => 'custom', 'via' => App\Logging\ElasticsearchLoggerFactory::class, 'index' => env('LOG_ES_INDEX', 'laravel-logs'), 'hosts' => env('LOG_ES_HOSTS', 'http://127.0.0.1:9200'), 'username' => env('LOG_ES_USERNAME', null), 'password' => env('LOG_ES_PASSWORD', null), 'level' => env('LOG_LEVEL', 'info'), ],
之后可以在.env文件中添加对应ES配置项。
3 创建通道工厂类
新建app/Logging/ElasticsearchLoggerFactory.php文件,实现通道实例化逻辑:
<?php namespace App\Logging; use Monolog\Logger; use Monolog\Formatter\ElasticsearchFormatter; use Monolog\Handler\ElasticsearchHandler; use Elastic\Elasticsearch\ClientBuilder; class ElasticsearchLoggerFactory { public function __invoke(array $config) { // 初始化ES客户端 $client = ClientBuilder::create() ->setHosts(explode(',', $config['hosts'])) ->setBasicAuthentication($config['username'], $config['password']) ->build(); // 初始化ES处理程序 $handler = new ElasticsearchHandler($client, [ 'index' => $config['index'], 'type' => '_doc', // ES7+已经废弃type,这里固定写_doc即可 ]); $handler->setLevel($config['level']); // 设置自带的Elasticsearch格式化器 $formatter = new ElasticsearchFormatter($config['index'], '_doc'); $handler->setFormatter($formatter); // 返回Logger实例 return new Logger('elasticsearch', [$handler]); } }
4 功能验证
执行测试代码即可向ES写入日志:\Log::channel('elasticsearch')->info('日志写入测试', ['user_id' => 1, 'action' => 'test_action']);
注意事项
- 若要修改日志结构,可自定义格式化器替换自带的
ElasticsearchFormatter,调整输出字段 - 生产环境建议开启
ElasticsearchHandler的缓冲配置,减少ES请求频次,避免影响业务性能 - 确保Laravel运行环境有权限访问ES服务的对应端口,避免连接失败
内容的提问来源于stack exchange,提问作者Max Shaian
相关产品推荐
相关产品推荐

