PHP 项目搭建 ELK 日志监控体系完整指南

ELK (Elasticsearch + Logstash + Kibana) 是当前最流行的日志管理解决方案之一。下面详细介绍如何为 PHP 项目搭建完整的 ELK 日志监控体系。

一、基础架构组成

php 复制代码
PHP应用 → Filebeat → Logstash → Elasticsearch → Kibana
                (可选) ↗

二、环境准备

1. 服务器要求

  • 建议独立服务器部署

  • 最低配置:4核CPU/8GB内存/100GB存储

  • 推荐配置:8核CPU/16GB内存/500GB SSD(生产环境)

2. 组件版本选择

bash 复制代码
# 推荐使用相同大版本
Elasticsearch 8.x
Logstash 8.x
Kibana 8.x
Filebeat 8.x

三、详细安装配置步骤

1. Elasticsearch 安装配置

bash 复制代码
# 安装(Ubuntu示例)
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
sudo apt update && sudo apt install elasticsearch

# 基础配置 /etc/elasticsearch/elasticsearch.yml
cluster.name: php-logs
node.name: node-1
network.host: 0.0.0.0
discovery.type: single-node # 单节点模式
xpack.security.enabled: true # 启用安全认证

# 启动服务
sudo systemctl start elasticsearch
sudo systemctl enable elasticsearch

# 设置密码
sudo /usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto

2. Logstash 配置

bash 复制代码
sudo apt install logstash

创建配置文件 /etc/logstash/conf.d/php.conf

ruby 复制代码
input {
  beats {
    port => 5044
  }
}

filter {
  grok {
    match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:message}" }
  }
  
  date {
    match => ["timestamp", "ISO8601"]
    target => "@timestamp"
  }
  
  mutate {
    remove_field => ["timestamp"]
  }
}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "php-logs-%{+YYYY.MM.dd}"
    user => "elastic"
    password => "your_password"
  }
}

启动服务:

bash 复制代码
sudo systemctl start logstash
sudo systemctl enable logstash

3. Kibana 安装配置

bash 复制代码
sudo apt install kibana

配置 /etc/kibana/kibana.yml

bash 复制代码
server.host: "0.0.0.0"
server.port: 5601
elasticsearch.hosts: ["http://localhost:9200"]
elasticsearch.username: "elastic"
elasticsearch.password: "your_password"

启动服务:

bash 复制代码
sudo systemctl start kibana
sudo systemctl enable kibana

4. Filebeat 客户端配置(PHP服务器)

bash 复制代码
sudo apt install filebeat

配置 /etc/filebeat/filebeat.yml

bash 复制代码
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/www/html/storage/logs/*.log # PHP日志路径
  fields:
    app: php-app
    env: production

output.logstash:
  hosts: ["logstash-server:5044"]

启动服务:

bash 复制代码
sudo systemctl start filebeat
sudo systemctl enable filebeat

四、PHP 应用日志集成

1. Monolog 配置示例

bash 复制代码
// composer.json
{
  "require": {
    "monolog/monolog": "^2.0"
  }
}
bash 复制代码
// 日志配置示例
use Monolog\Logger;
use Monolog\Handler\StreamHandler;

$log = new Logger('app');
$log->pushHandler(new StreamHandler(__DIR__.'/storage/logs/app.log', Logger::DEBUG));

// 结构化日志示例
$log->info('User login', [
    'user_id' => 123,
    'ip' => $_SERVER['REMOTE_ADDR'],
    'user_agent' => $_SERVER['HTTP_USER_AGENT']
]);

2. 日志格式优化

推荐使用JSON格式日志:

bash 复制代码
$jsonHandler = new StreamHandler(
    __DIR__.'/logs/app.json',
    Logger::DEBUG
);
$jsonHandler->setFormatter(new JsonFormatter());
$log->pushHandler($jsonHandler);

五、Kibana 仪表板配置

  1. 访问 http://your-server:5601

  2. 创建索引模式 php-logs-*

  3. 创建可视化图表:

    • 错误日志统计

    • 请求响应时间分布

    • 用户行为热力图

  4. 设置警报规则(如5分钟内错误超过100次触发报警)

六、高级功能配置

1. 日志归档策略

bash 复制代码
# Logstash添加以下output
output {
  # 每天归档日志到S3
  s3 {
    access_key_id => "your_key"
    secret_access_key => "your_secret"
    region => "us-east-1"
    bucket => "php-logs-archive"
    time_file => 24
    codec => "json"
  }
}

2. 性能优化建议

bash 复制代码
# Elasticsearch优化 /etc/elasticsearch/jvm.options
-Xms4g
-Xmx4g

# Logstash管道优化
pipeline.workers: 4
pipeline.batch.size: 100

3. 安全加固

bash 复制代码
# 设置防火墙规则
sudo ufw allow 9200/tcp # Elasticsearch
sudo ufw allow 5601/tcp # Kibana
sudo ufw allow 5044/tcp # Logstash

七、常见问题解决

  1. 日志收集延迟

    bash 复制代码
    # 检查Filebeat状态
    sudo filebeat test output
    
    # 增加Logstash管道线程
    pipeline.workers: 8
  2. 磁盘空间不足

    bash 复制代码
    # 设置Elasticsearch索引生命周期管理
    PUT _ilm/policy/php-logs-policy
    {
      "policy": {
        "phases": {
          "hot": {
            "actions": {
              "rollover": {
                "max_size": "50GB"
              }
            }
          },
          "delete": {
            "min_age": "30d",
            "actions": {
              "delete": {}
            }
          }
        }
      }
    }
  3. 日志解析失败

    bash 复制代码
    # 更新Logstash的grok模式
    filter {
      grok {
        match => { "message" => ["%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:message}", 
                                "备用模式"] }
      }
    }

    八、监控指标建议

  4. 关键指标

    • 错误率(5xx响应占比)

    • 慢请求(>1s的请求)

    • 用户行为异常(如频繁登录失败)

  5. 报警规则示例

    bash 复制代码
    {
      "alert_name": "High Error Rate",
      "conditions": {
        "threshold": 5,
        "time_window": "5m",
        "metric": "error_count"
      }
    }

    通过以上完整配置,您可以为PHP应用构建一个高效、可靠的日志监控系统,实现从日志收集、存储到可视化分析的全流程管理。

相关推荐
Long_poem6 天前
【自学笔记】ELK基础知识点总览-持续更新
笔记·elk·jenkins
奔跑吧邓邓子9 天前
【商城实战(97)】ELK日志管理系统的全面应用
elk·日志管理系统·商城实战
yunqi121510 天前
【监控系列】ELK
elk
北枫寒夜11 天前
简单ELK框架搭建
elk
DS_Watson18 天前
docker 部署elk 设置账号密码
linux·elk·docker
落魄实习生20 天前
ELK(Elasticsearch、Logstash、Kbana)安装及Spring应用
spring·elk·elasticsearch
1 Byte20 天前
【微服务日志收集①】使用FileBeat+Logstash+ES搭建ELK日志系统
elk·elasticsearch·日志收集系统
戏神22 天前
ELK+Filebeat+Kafka+Zookeeper安装部署
nginx·elk·zookeeper·kafka·filebeat·集群部署·分布式系统
C1829818257522 天前
ELK traceId 通过A服务调用B服务举例
hive·hadoop·elk