如何为Laravel项目搭建ELK Stack实现日志监控与可视化分析?
Laravel 项目搭建 ELK Stack 日志监控指南
一、环境准备
以 Ubuntu/Debian 服务器为例,先完成基础依赖安装:
- 确保服务器已安装对应 Laravel 版本的 PHP(>=7.4,根据你的 Laravel 版本调整)
- 安装 ELK 依赖的 Java 11+:
sudo apt update && sudo apt install openjdk-11-jre-headless - 验证 Java 安装:
java -version,确认输出版本信息即可。
二、安装 ELK 组件
1. 安装 Elasticsearch
- 添加 Elastic 官方源并安装:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic.list sudo apt update && sudo apt install elasticsearch - 启动并设置开机自启:
sudo systemctl enable --now elasticsearch - 验证安装:
curl http://localhost:9200,返回包含集群信息的 JSON 响应即为成功。
2. 安装 Kibana
- 直接通过已添加的源安装:
sudo apt install kibana - 启动并设置开机自启:
sudo systemctl enable --now kibana - 初始化访问:浏览器打开
http://你的服务器IP:5601,按提示运行以下命令获取 Kibana 注册令牌,完成初始化:sudo /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
3. 安装 Logstash
- 通过官方源安装:
sudo apt install logstash - 启动并设置开机自启:
sudo systemctl enable --now logstash
三、配置 Laravel 日志输出
为了让 Logstash 能轻松解析,需将 Laravel 日志改为 JSON 格式:
方式1:输出到 JSON 文件
- 编辑
config/logging.php,新增一个json日志通道:'json' => [ 'driver' => 'single', 'path' => storage_path('logs/laravel.json'), 'formatter' => \Monolog\Formatter\JsonFormatter::class, ], - 修改
.env文件,指定日志通道:LOG_CHANNEL=json
方式2:输出到标准错误流(适合容器或进程管理场景)
- 编辑
config/logging.php,在stack通道中添加stderr子通道:'stack' => [ 'driver' => 'stack', 'channels' => ['single', 'stderr'], 'ignore_exceptions' => false, ], 'stderr' => [ 'driver' => 'monolog', 'handler' => StreamHandler::class, 'formatter' => \Monolog\Formatter\JsonFormatter::class, 'with' => [ 'stream' => 'php://stderr', ], ], - 修改
.env:LOG_CHANNEL=stack
四、配置 Logstash 收集解析 Laravel 日志
Logstash 配置分为输入、过滤、输出三部分,创建专属配置文件:
sudo nano /etc/logstash/conf.d/laravel-log.conf
1. 输入配置(以 JSON 文件为例)
input { file { path => "/var/www/你的Laravel项目路径/storage/logs/laravel.json" start_position => "beginning" # 首次启动读取历史日志,生产环境可改为"end" codec => "json" # 直接解析JSON格式日志 } }
2. 过滤配置(解析并清洗日志字段)
filter { # 将Laravel的datetime字段转为Elasticsearch标准时间字段 date { match => [ "datetime", "Y-m-d H:i:s" ] target => "@timestamp" } # 提取请求URL、用户ID等上下文字段(根据你的日志结构调整) if [context][url] { mutate { add_field => { "request_url" => "%{[context][url]}" } } } if [context][user_id] { mutate { add_field => { "user_id" => "%{[context][user_id]}" } } } # 移除敏感或无用字段 mutate { remove_fields => ["datetime", "password", "token", "extra"] } }
3. 输出配置(发送到 Elasticsearch)
output { elasticsearch { hosts => ["http://localhost:9200"] index => "laravel-logs-%{+YYYY.MM.dd}" # 按日期拆分索引,便于管理 } # 调试阶段可打开以下配置,在控制台查看解析后的日志 # stdout { codec => rubydebug } }
验证并重启 Logstash
- 测试配置文件合法性:
sudo /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/laravel-log.conf --config.test_and_exit - 重启 Logstash 生效:
sudo systemctl restart logstash
五、Kibana 可视化配置
1. 创建索引模式
- 进入 Kibana 的 Stack Management → Index Patterns → Create index pattern
- 输入索引匹配规则
laravel-logs-*,点击 Next step - 选择
@timestamp作为时间字段,点击 Create index pattern
2. 常用可视化示例
(1)日志级别分布饼图
- 进入 Visualize Library → Create visualization → 选择 Pie
- 关联刚创建的索引模式
- Metrics 选择
Count,Buckets 添加 Split slices,字段选level_name.keyword - 点击 Update 预览效果,保存为「日志级别分布」
(2)请求响应时间趋势图(需 Laravel 日志包含响应时间字段)
- 创建 Line 类型可视化
- Metrics 选择
Average,字段选context.response_time(需提前在 Laravel 日志中添加该字段) - Buckets 添加 X-axis,类型选
Date Histogram,字段为@timestamp,间隔选Auto - 保存为「请求响应时间趋势」
(3)错误日志快速查看
- 进入 Discover,添加筛选条件
level_name: ERROR,保存该搜索,后续可直接打开查看所有错误日志
六、优化建议
- 日志轮转:配置
logrotate避免 Laravel 日志文件过大,创建配置文件/etc/logrotate.d/laravel:/var/www/你的Laravel项目路径/storage/logs/laravel.json { daily missingok rotate 30 compress delaycompress notifempty create 644 www-data www-data } - 性能优化:高流量项目建议用 Filebeat 代替 Logstash 直接收集日志,再转发到 Logstash/Elasticsearch,降低 Logstash 负载
- 日志字段增强:在 Laravel 的
AppServiceProvider中添加上下文信息,比如用户ID、请求IP:use Illuminate\Support\Facades\Log; public function boot() { Log::withContext([ 'user_id' => auth()->id() ?? null, 'request_ip' => request()->ip(), 'environment' => app()->environment(), ]); } - 安全配置:给 Elasticsearch 设置用户名密码,Kibana 开启登录验证,防止未授权访问
内容的提问来源于stack exchange,提问作者Kaio Da Dalt
相关产品推荐
相关产品推荐

