ELK Stack 实战指南:日志收集与分析

ELK Stack 是一个强大的开源工具组合,用于日志的收集、存储、搜索和可视化。它由三个核心组件构成:

  • Elasticsearch:分布式搜索和分析引擎,用于存储和查询日志数据。
  • Logstash:数据收集和处理管道,负责接收、过滤和转发日志。
  • Kibana:数据可视化平台,用于创建仪表盘和图表。

本指南将一步步引导您完成 ELK Stack 的实战部署,包括安装、配置和一个完整的日志分析示例。我们将以收集和分析系统日志(如 /var/log/syslog)为例,帮助您快速上手。所有步骤基于 Linux 系统(如 Ubuntu),确保真实可靠。


步骤 1: 安装 ELK Stack

首先,确保系统已更新,并安装 Java(ELK 依赖 Java 环境)。

sudo apt update && sudo apt upgrade -y  # 更新系统
sudo apt install openjdk-17-jdk -y      # 安装 Java
java -version                           # 验证安装

安装 Elasticsearch

添加 Elastic 仓库并安装:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic.gpg
echo "deb [signed-by=/usr/share/keyrings/elastic.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-8.x.list
sudo apt update && sudo apt install elasticsearch -y

启动并验证服务:

sudo systemctl start elasticsearch
sudo systemctl enable elasticsearch
curl -X GET "localhost:9200"           # 应返回 JSON 响应,确认运行正常

安装 Logstash

安装包:

sudo apt install logstash -y

启动服务:

sudo systemctl start logstash
sudo systemctl enable logstash

安装 Kibana

安装包:

sudo apt install kibana -y

启动并访问:

sudo systemctl start kibana
sudo systemctl enable kibana

打开浏览器访问 http://localhost:5601,Kibana 界面应加载。


步骤 2: 配置 Logstash 收集日志

Logstash 使用管道配置文件(.conf)定义输入、过滤和输出。创建一个简单管道来收集系统日志。

创建配置文件:

sudo nano /etc/logstash/conf.d/syslog.conf

添加以下内容(输入从文件读取 syslog,过滤解析日志,输出到 Elasticsearch):

input {
  file {
    path => "/var/log/syslog"   # 日志文件路径
    start_position => "beginning" # 从文件开头读取
    sincedb_path => "/dev/null"  # 禁用 sincedb,便于测试
  }
}

filter {
  grok {
    match => { "message" => "%{SYSLOGTIMESTAMP:timestamp} %{SYSLOGHOST:hostname} %{DATA:program}(?:\[%{POSINT:pid}\])?: %{GREEDYDATA:message}" } # 使用 grok 解析日志格式
  }
  date {
    match => [ "timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ] # 转换时间戳
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"] # 输出到本地 Elasticsearch
    index => "syslog-%{+YYYY.MM.dd}" # 按日期创建索引
  }
}

启动 Logstash 管道:

sudo systemctl restart logstash

验证日志收集:使用 tail -f /var/log/logstash/logstash-plain.log 查看 Logstash 日志,确保无错误。


步骤 3: 在 Kibana 中分析和可视化日志

登录 Kibana (http://localhost:5601),设置索引模式并创建可视化。

创建索引模式
  1. 导航到 Management > Stack Management > Index Patterns
  2. 输入 syslog-* 作为索引模式,点击 Create index pattern
  3. 选择 @timestamp 作为时间字段。
分析日志数据

Discover 标签页,选择 syslog-* 索引模式,查看实时日志。例如,搜索 program: "kernel" 过滤内核日志。

创建可视化图表

假设我们分析错误日志率:

  • 错误率公式:如果日志中包含错误消息,错误率可定义为 $ r = \frac{\text{错误日志数}}{\text{总日志数}} \times 100% $。
    在 Kibana 中实现:
  1. 导航到 Visualize > Create visualization
  2. 选择 Lens 类型,使用 syslog-* 索引。
  3. 创建饼图:
    • X-axis: 聚合 Terms,字段 program.keyword(显示不同程序)。
    • Y-axis: 聚合 Count(日志数量)。
  4. 添加过滤器:在查询栏输入 message: "error" 来聚焦错误日志。
  5. 保存为 "Syslog Error Distribution"。
示例仪表盘

创建一个仪表盘:

  1. Dashboard > Create dashboard
  2. 添加上述饼图,并添加一个数据表:显示 programmessage 字段。
  3. 保存为 "System Log Monitor"。

步骤 4: 实战示例:分析 Apache 访问日志

扩展应用:收集 Apache Web 服务器访问日志,分析请求率和响应时间。

配置 Logstash 收集 Apache 日志

编辑新配置文件:

sudo nano /etc/logstash/conf.d/apache.conf

内容:

input {
  file {
    path => "/var/log/apache2/access.log" # Apache 日志路径
    start_position => "beginning"
  }
}

filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" } # 标准 Apache 格式解析
  }
  mutate {
    convert => { "response" => "integer" } # 转换响应码为数字
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "apache-%{+YYYY.MM.dd}"
  }
}

重启 Logstash:sudo systemctl restart logstash

在 Kibana 中分析
  1. 创建索引模式 apache-*
  2. Discover 中查看请求数据。
  3. 创建可视化:
    • 请求率趋势图:折线图,X-axis 为 @timestamp(按小时聚合),Y-axis 为 Count
    • 平均响应时间:计算平均响应时间(毫秒),公式 $ \text{avg_time} = \frac{\sum \text{response_time}}{n} $。在 Kibana 中,使用 Y-axis 聚合 Average,字段 response_time

最佳实践和常见问题

  • 性能优化
    • Elasticsearch:增加内存设置(编辑 /etc/elasticsearch/jvm.options),例如 -Xms4g -Xmx4g
    • Logstash:使用多个管道或 worker 线程(在配置中设置 pipeline.workers: 4)。
  • 安全性:启用 Elasticsearch 和 Kibana 的 HTTPS 和认证(参考官方文档)。
  • 常见问题
    • 日志不显示?检查 Logstash 日志和 Elasticsearch 索引状态(curl 'localhost:9200/_cat/indices?v')。
    • 解析失败?调整 grok 模式或使用在线工具(如 Kibana 的 Grok Debugger)。
  • 扩展性:对于大规模日志,添加 Filebeat(轻量级收集器)替代 Logstash 输入。

通过本指南,您已掌握 ELK Stack 的核心实战技能。ELK Stack 能高效处理 TB 级日志,支持实时监控和故障排查。如需深入,请参考官方文档或社区资源。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐