要实现TP5.1日志全量检索,必须采用ELK架构:Filebeat或Logstash采集runtime/log下非结构化文本日志,解析为结构化字段(timestamp、level、location、message等),写入按日期命名的ES索引(如tp-log-2026.07.09),再通过Kibana配置Index Pattern与检索语法进行可视化查询。

TP5.1 项目本身不内置日志检索能力,要实现日志全量检索,不能只靠 Elasticsearch 单独工作,必须结合 Logstash(或 Filebeat)采集日志、Elasticsearch 存储与索引、Kibana 可视化查询——即标准 ELK 架构。直接在 TP5.1 中调用 ES Client 做“日志检索”,本质是查你主动写入 ES 的业务数据,不是自动采集的运行日志。
明确日志来源:TP5.1 的日志默认不进 ES
ThinkPHP5.1 默认将日志写入 runtime/log/ 目录下的文件(如 2026-07-09.log),这些是纯文本、无结构、带时间戳但无字段划分的日志。Elasticsearch 无法直接读取或解析这类文件——它不支持“tail 日志文件”这种操作。必须借助中间件完成采集、解析、转发。
- Logstash 是传统方案:配置 file input 插件监听 runtime/log/,用 grok 或 json codec 解析格式,再 output 到 ES
- Filebeat 更轻量推荐:专为日志采集设计,资源占用低,支持多行合并(解决 TP 日志跨行问题),直连 ES 或经 Logstash 做清洗
- 不能跳过这步:不采集,ES 里就没有日志文档,后续所有“检索”都无从谈起
适配 TP5.1 日志格式:解析是关键
TP5.1 默认日志格式类似:[2026-07-09 13:26:01] INFO : appindexcontrollerIndex->index - hello world
这种格式没有固定分隔符,也不含 JSON 结构,Logstash 或 Filebeat 需定制解析规则才能提取出 level、time、module、message 等字段。
- Logstash 示例 grok pattern:
%{TIMESTAMP_ISO8601:timestamp}s+%{LOGLEVEL:level}s+:s+%{DATA:location}s+-s+%{GREEDYDATA:message} - Filebeat 可启用 multiline:对堆栈跟踪等多行日志自动合并,避免一条错误被拆成多条
- 更优做法:修改 TP5.1 日志驱动,输出 JSON 格式(如用 Monolog + JsonFormatter),省去复杂解析
ES 索引设计:按日志生命周期建模
不要为所有日志建一个大索引。TP5.1 日志天然按天分割(2026-07-09.log),对应 ES 应使用 基于时间的索引别名(如 tp-log-2026.07.09),再统一映射到 tp-log 别名下。
- 好处:便于按日期滚动删除旧日志(避免磁盘爆满),提升查询效率(ES 只查匹配日期的分片)
- Mapping 建议包含字段:
timestamp(date)、level(keyword)、location(text)、message(text)、ip(keyword, 可从 request 获取补充) - 避免全文检索所有字段:对
message开启 ik_max_word 分词,对level和ip用 keyword 类型精确匹配
Kibana 配置:让检索真正可用
装好 Kibana 后,需手动创建 Index Pattern(如 tp-log-*),指定 @timestamp 字段为时间过滤主键。之后就能用 Discover 页面做实时检索。
- 常用检索语法:
level: "ERROR"、message: "SQLSTATE"、location: "app\user\controller\Login" - 组合查询:
level: "ERROR" and message: "timeout",支持通配符message: "Connection*" - 保存常用查询为 Saved Search,或构建 Dashboard 展示错误趋势、高频异常模块


















