ELK 日志采集与解析实战

发布于:2025-09-13 ⋅ 阅读:(17) ⋅ 点赞:(0)

ELK 日志采集与解析实战

在上一篇中,我们完成了 ELK 集群的部署与优化。\ 本篇将介绍日志采集、解析及常用字段增强的实战方法,让你可以快速上手生产环境日志管理。


一、日志采集前的规划

1. 采集目标

  • 系统日志:/var/log/messages、/var/log/syslog

  • Web 日志:Nginx/Apache 日志

  • 应用日志:Java、Python、Go 应用日志

2. 采集节点规划

  • 数据节点无需安装采集工具

  • 每台需要采集日志的服务器安装 Filebeat

  • 可使用 Ansible 批量部署配置文件

3. 字段规划

  • timestamp:日志时间

  • host:日志来源主机

  • service:应用服务名

  • level:日志级别(INFO/ERROR/WARN)

  • message:日志内容


二、Filebeat 部署与配置

1. 安装 Filebeat

CentOS / RHEL

rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
yum install https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.8.2-x86_64.rpm

Ubuntu / Debian

wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.8.2-amd64.deb
dpkg -i filebeat-8.8.2-amd64.deb

2. 配置 Filebeat

编辑 /etc/filebeat/filebeat.yml:

filebeat.inputs:
- type: log
  paths:
    - /var/log/messages
    - /var/log/syslog
  fields:
    service: system
  fields_under_root: true
  ignore_older: 72h
​
- type: log
  paths:
    - /var/log/nginx/access.log
    - /var/log/nginx/error.log
  fields:
    service: nginx
  fields_under_root: true
​
output.logstash:
  hosts: ["10.0.0.1:5044"]

3. 启动 Filebeat

sudo systemctl enable filebeat
sudo systemctl start filebeat
sudo systemctl status filebeat

三、Logstash 配置与解析

1. Logstash 管道设计

示例 pipeline 配置:/etc/logstash/conf.d/logs.conf
input {
  beats {
    port => 5044
  }
}
​
filter {
  if [service] == "nginx" {
    grok {
      match => { "message" => "%{IP:client_ip} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:status}" }
    }
    date {
      match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
      target => "@timestamp"
    }
  } else if [service] == "system" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_time} %{HOSTNAME:host} %{WORD:process}: %{GREEDYDATA:msg}" }
    }
    date {
      match => [ "syslog_time", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
      target => "@timestamp"
    }
  }
}
​
output {
  elasticsearch {
    hosts => ["http://10.0.0.1:9200"]
    index => "%{service}-%{+YYYY.MM.dd}"
  }
  stdout { codec => rubydebug }
}

2. 常用字段增强

geoip:解析客户端 IP 地理信息

filter {
  if [client_ip] {
    geoip {
      source => "client_ip"
      target => "geo"
      database => "/etc/logstash/GeoLite2-City.mmdb"
    }
  }
}

用户自定义标签

mutate {
  add_field => { "env" => "production" }
}

四、索引管理与优化

1. 索引模板

PUT _template/nginx_template
{
  "index_patterns": ["nginx-*"],
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  },
  "mappings": {
    "properties": {
      "@timestamp": { "type": "date" },
      "client_ip": { "type": "ip" },
      "request": { "type": "text" },
      "status": { "type": "integer" }
    }
  }
}

2. ILM(索引生命周期管理)

  • 热数据:7 天 SSD

  • 冷数据:30 天 HDD

  • 归档数据:长期存储或删除

五、监控与排查

1. 检查 Filebeat 状态

filebeat test output
filebeat test config

2. 检查 Logstash 管道

sudo systemctl status logstash
journalctl -u logstash -f

3. Elasticsearch 索引检查

curl http://10.0.0.1:9200/_cat/indices?v
curl http://10.0.0.1:9200/_cluster/health?pretty

六、实战经验

1. 日志量大时

  • 使用持久化队列防止 Filebeat 高峰丢日志

  • 调整 Logstash pipeline.workers、pipeline.batch.size

2. 多类型日志

  • 每种服务单独 pipeline 或使用 tags 区分

  • 使用 grok + mutate 做统一字段增强

3. 安全与权限

  • Elasticsearch 用户权限控制

  • TLS 加密 Filebeat → Logstash → ES

七、总结

  • Filebeat + Logstash + Elasticsearch 可高效采集和解析日志

  • grok 配置灵活,可针对不同日志自定义解析

  • 结合索引模板和 ILM,可实现高效存储和查询

  • 下一篇将深入 Kibana 可视化与告警实战,构建完整日志平台