需实现自定义ES日志驱动:一、创建EsDriver类继承thinklogDriver,批量写入ES并降级本地;二、注册驱动并配置host等参数;三、可用Logstash代理转发;四、支持Cron批量导入历史日志;五、配置ILM策略管理索引生命周期。

如果您在ThinkPHP项目中希望将日志直接写入Elasticsearch而非本地文件,需绕过默认File驱动,通过实现自定义日志驱动完成。以下是具体配置与实现步骤:
一、创建继承thinklogDriver的ES日志驱动类
该方法通过实现ThinkPHP日志驱动接口,将日志结构化后批量推送至Elasticsearch,避免阻塞主请求流程,并具备失败静默与本地降级能力。
1、在app/common/log/目录下新建EsDriver.php文件(确保符合PSR-4自动加载规范)。
2、声明命名空间并引入必要依赖:use thinklogDriver;、use ElasticsearchClientBuilder;。
立即学习“PHP免费学习笔记(深入)”;
3、定义EsDriver类并继承Driver,在构造方法中初始化Elasticsearch客户端,传入host、port等配置。
4、重写save(array $log): bool方法:遍历二维日志数组,按index + document成对组装bulk body;日期索引格式设为tp-log-Y-m-d。
5、调用$this->client->bulk()发送请求,成功返回true;捕获异常后写入本地runtime/log/es-fail.log,仍返回true。
二、注册自定义日志驱动并启用
该方法通过修改框架日志配置,使ThinkPHP识别并使用新驱动,同时规避ClassNotFoundException问题。
1、确认composer.json中已声明自动加载规则,例如:"psr-4": {"app\common\log\": "app/common/log/"}。
2、执行composer dump-autoload刷新自动加载映射。
3、在config/log.php中将type设为appcommonlogEsDriver,或使用闭包方式动态实例化。
4、提供必需配置项:'host' => '127.0.0.1:9200'、'timeout' => 1、'retries' => 1,确保超时短且重试可控。
5、验证驱动加载:在控制器中调用Log::record('test', 'info'),检查ES中tp-log-YYYY-MM-DD索引是否生成文档。
三、使用Logstash代理日志转发(替代直连驱动)
该方法解耦应用与ES依赖,利用Logstash作为中间件接收日志并写入ES,适用于无法安装PHP ES SDK或需统一日志治理的场景。
1、在ThinkPHP中配置日志类型为socket,目标地址设为127.0.0.1:5044(Logstash beats input端口)。
2、安装Filebeat并配置filebeat.yml,监控runtime/log/*.log,输出至Logstash。
3、编写Logstash配置php-log.conf,input使用beats插件,filter用grok解析ThinkPHP日志格式(如{date} [{time}] {level} {message}),output指向ES集群。
4、确保ES中预置索引模板,匹配php-logs-*索引名,定义level为keyword、message为text、@timestamp为date类型。
5、启动Filebeat与Logstash服务,确认ES中出现带@timestamp字段的新文档,且_source包含完整日志上下文。
四、通过Cron+脚本批量导入历史日志文件
该方法适用于已有大量本地日志文件需迁移至ES的场景,不侵入应用代码,以离线方式完成数据同步。
1、编写PHP脚本import_to_es.php,读取runtime/log/2026-04-*.log等文件内容。
2、按行解析日志,使用正则提取date、time、level、message字段,构建JSON文档数组。
3、调用Elasticsearch官方SDK的bulk()方法,每50条打包一次,索引名按日期生成,如tp-log-2026-04-24。
4、设置脚本执行权限:chmod +x import_to_es.php,并通过crontab -e添加每日凌晨执行任务:0 2 * * * /usr/bin/php /var/www/thinkphp/import_to_es.php。
5、运行脚本后检查ES响应结果,确认errors: false且items数量与输入行数一致,无400 Bad Request错误。
五、配置Elasticsearch索引生命周期与滚动策略
该方法保障ES日志索引长期运行的稳定性与可维护性,防止磁盘爆满及查询性能衰减。
1、在ES中创建ILM策略thinkphp-log-policy,定义hot阶段保留7天、delete阶段自动删除30天前索引。
2、创建索引模板thinkphp-log-template,匹配tp-log-*,绑定上述ILM策略,并设置number_of_shards: 1、number_of_replicas: 0(单节点开发环境)。
3、在ThinkPHP的ES驱动中,将索引名硬编码逻辑改为调用date('Y-m-d')动态生成,确保每日新建索引。
4、验证ILM生效:等待24小时后,执行GET /_ilm/explain,确认tp-log-2026-04-23处于hot阶段且action为rollover。
5、手动触发一次rollover测试:POST /tp-log-2026-04-24/_rollover,观察是否生成tp-log-2026-04-24-000001新索引并迁移别名。



















