Laravel日志接入ELK的关键卡点是日志格式结构化、Filebeat多路径采集配置及Logstash的grok规则匹配——任一出错,Kibana就查不到数据;因Laravel daily驱动默认输出纯文本而非JSON,Logstash的json或grok过滤器无法解析,导致字段为空或整条跳过。

直接说结论:Laravel 日志接入 ELK 不是“配好 Logstash 就完事”,关键卡点在日志格式结构化、Filebeat 多路径采集配置、以及 Logstash 的 grok 规则是否匹配真实日志内容——这三处任一出错,Kibana 就查不到数据。
为什么 Laravel 默认日志进不了 Kibana?
因为 Laravel daily 驱动默认输出的是纯文本(非 JSON),而 Logstash 的 grok 或 json 过滤器需要明确字段结构。你看到的 laravel.log 里类似这样的行:
[2026-07-09 08:30:22] production.ERROR: User login failed for ID 123 {"exception":"[object] (App\Exceptions\AuthException(code: 401): ..."} 它不是标准 JSON,json 过滤器会跳过;用 grok 又得写对正则——否则 timestamp、log_level、message 全是空字段。
- 别指望
%{COMBINEDAPACHELOG}能解析 Laravel 日志——那是给 Nginx/Apache 设计的 -
date插件必须匹配你日志里的时间格式,比如yyyy-MM-dd HH:mm:ss,不是dd/MMM/yyyy:HH:mm:ss Z - 如果用了
stack通道混用slack或papertrail,那些日志根本不会落盘到storage/logs/,Filebeat 就采集不到
Filebeat 必须监控 storage/logs/ 下的全部匹配文件
很多项目启用了多环境或分应用日志(如 laravel-2026-07-09.log、queue.log、horizon.log),但 Filebeat 默认只扫 laravel.log。漏掉任意一个,就等于丢掉一部分异常上下文。
- 路径要写成
- /path/to/storage/logs/laravel-*.log或- /path/to/storage/logs/*.log,不能只写laravel.log - 加
multiline.pattern防止堆栈跟踪被拆成多条记录:multiline.pattern: '^[d{4}-d{2}-d{2}' - 用
fields打标很重要:service: myapp、environment: production,后续在 Kibana 里才能按服务/环境筛选 - 确认
output.logstash.hosts指向的是 Logstash 的beats输入端口(默认5044),不是 Elasticsearch 的9200
Logstash filter 要分情况写 grok 规则
不同 Laravel 版本、不同日志级别、是否开启 APP_DEBUG,输出格式都不同。最稳妥的方式是先用 stdout { codec => rubydebug } 看原始事件结构,再写规则。
- 常见 Laravel 10+ 日志开头是
[YYYY-MM-DD HH:MM:SS] env.LEVEL: msg,对应 grok:match => { "message" => "[%{TIMESTAMP_ISO8601:timestamp}] %{DATA:env}.%{DATA:log_level}: %{GREEDYDATA:message}" } - 如果日志里含 JSON 异常对象(如
{"exception":"..."}),加json { source => "message" target => "exception_json" skip_on_invalid_json => true } - 务必加
date { match => ["timestamp", "yyyy-MM-dd HH:mm:ss"] },否则 Elasticsearch 里@timestamp是 Logstash 接收时间,不是日志发生时间 - 避免在 filter 里用
mutate { remove_field => ["message"] }——删了原始字段,调试时就看不到原始输入了
真正容易被忽略的点:日志权限与轮转干扰
Filebeat 以非 root 用户运行(比如 filebeat 用户),但 Laravel 写日志用的是 web server 用户(如 www-data)。如果 storage/logs/ 目录权限是 755 www-data:www-data,Filebeat 就读不了文件——日志采集静默失败,连错误都不报。
另外,daily 驱动每天零点重命名日志文件(laravel.log → laravel-2026-07-08.log),Filebeat 默认会继续监控旧文件句柄,新日志写不进去。必须配 close_inactive: 24h 和 clean_removed: true 才能自动切换。


















