日志管理工具 ——ELK Stack

发布于:2025-08-02 ⋅ 阅读:(10) ⋅ 点赞:(0)

一、ELK Stack 概述

1.1 核心组件

ELK Stack(现更名为 Elastic Stack)是一套开源的日志收集、存储、分析和可视化平台,由三个核心组件构成:

  • Elasticsearch:分布式搜索引擎,负责日志数据的存储、索引和快速查询
  • Logstash:日志数据收集和处理管道,支持多种数据源和数据转换
  • Kibana:日志数据可视化平台,提供丰富的图表和仪表盘

随着发展,ELK Stack 逐渐扩展为包含 Beats 的 Elastic Stack,形成更完整的日志管理生态:

1.2 核心特性

  • 分布式架构:可水平扩展以处理海量日志数据
  • 实时处理:支持日志数据的实时收集、存储和分析
  • 全文检索:强大的搜索功能,支持复杂查询和过滤
  • 灵活的可视化:通过 Kibana 创建自定义仪表盘和报表
  • 丰富的集成:支持与多种系统和工具集成(如 Docker、Kubernetes、AWS 等)
  • 可扩展性:通过插件扩展功能,满足特定需求

1.3 应用场景

ELK Stack 适用于多种日志管理场景:

  • 应用程序日志集中管理和分析
  • 系统和基础设施监控
  • 安全事件日志分析与审计
  • 用户行为追踪与分析
  • 业务数据可视化与报表
  • 故障排查与问题定位

二、ELK Stack 安装与部署

2.1 环境准备

2.1.1 系统要求

组件

最低配置

推荐配置

Elasticsearch

2CPU、4GB 内存

4CPU、16GB 内存

Logstash

2CPU、4GB 内存

4CPU、8GB 内存

Kibana

1CPU、2GB 内存

2CPU、4GB 内存

Beats

1CPU、1GB 内存

2CPU、2GB 内存

2.1.2 操作系统支持
  • Linux(推荐 CentOS 7/8、Ubuntu 18.04/20.04、Debian 10)
  • Windows Server(有限支持)
  • macOS(开发环境)
2.1.3 依赖项
  • Java 8 或 11(Elasticsearch 和 Logstash 需要)
  • 网络:各组件间需开放相应端口(9200、9300、5044、5601 等)

2.2 Elasticsearch 安装

2.2.1 安装 Java
# CentOS安装Java 11
yum install -y java-11-openjdk-devel

# Ubuntu安装Java 11
apt update
apt install -y openjdk-11-jdk

# 验证Java安装
java -version
2.2.2 安装 Elasticsearch
# 导入Elasticsearch GPG密钥
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch  # CentOS
# 或
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -  # Ubuntu

# 添加Elasticsearch仓库
# CentOS
cat > /etc/yum.repos.d/elasticsearch.repo << EOF
[elasticsearch-7.x]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF

# Ubuntu
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic.list
apt update

# 安装Elasticsearch
yum install -y elasticsearch  # CentOS
# 或
apt install -y elasticsearch  # Ubuntu
2.2.3 配置 Elasticsearch
# 编辑配置文件
vim /etc/elasticsearch/elasticsearch.yml

# 核心配置
cluster.name: elk-cluster  # 集群名称
node.name: es-node-1       # 节点名称
path.data: /var/lib/elasticsearch  # 数据存储路径
path.logs: /var/log/elasticsearch  # 日志路径
network.host: 0.0.0.0      # 监听地址,0.0.0.0表示所有地址
http.port: 9200            # HTTP端口
discovery.seed_hosts: ["127.0.0.1"]  # 种子节点
cluster.initial_master_nodes: ["es-node-1"]  # 初始主节点

# 可选性能配置
bootstrap.memory_lock: true  # 锁定内存,防止swap

配置系统参数:

# 配置内存锁定
vim /etc/elasticsearch/jvm.options
# 设置JVM堆大小(建议为物理内存的50%,不超过31GB)
-Xms4g
-Xmx4g

# 配置系统限制
vim /etc/security/limits.conf
# 添加
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
elasticsearch - nofile 65536
elasticsearch - nproc 4096

# 配置系统内核参数
vim /etc/sysctl.conf
# 添加
vm.max_map_count=262144

# 应用配置
sysctl -p
2.2.4 启动并验证 Elasticsearch
# 启动服务
systemctl start elasticsearch
systemctl enable elasticsearch

# 检查服务状态
systemctl status elasticsearch

# 验证服务
curl -X GET "http://localhost:9200/"

# 预期输出
{
  "name" : "es-node-1",
  "cluster_name" : "elk-cluster",
  "cluster_uuid" : "xxxxxxxxxxxxxxxxxxxx",
  "version" : {
    "number" : "7.14.0",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "dd5a0a2acaa2045e41b5de95cb3e88ec9e074d",
    "build_date" : "2021-07-29T20:49:32.864135063Z",
    "build_snapshot" : false,
    "lucene_version" : "8.9.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

2.3 Kibana 安装与配置

2.3.1 安装 Kibana
# CentOS安装
yum install -y kibana

# Ubuntu安装
apt install -y kibana
2.3.2 配置 Kibana
# 编辑配置文件
vim /etc/kibana/kibana.yml

# 核心配置
server.port: 5601                # 端口
server.host: "0.0.0.0"           # 监听地址
elasticsearch.hosts: ["http://localhost:9200"]  # Elasticsearch地址
kibana.index: ".kibana"          # Kibana索引名称
2.3.3 启动并验证 Kibana
# 启动服务
systemctl start kibana
systemctl enable kibana

# 检查服务状态
systemctl status kibana

# 开放防火墙端口(如需要)
firewall-cmd --permanent --add-port=5601/tcp
firewall-cmd --reload

通过浏览器访问 http://<kibana-host>:5601 验证 Kibana 是否正常运行。

2.4 Logstash 安装与配置

2.4.1 安装 Logstash
# CentOS安装
yum install -y logstash

# Ubuntu安装
apt install -y logstash
2.4.2 基本配置

创建一个简单的 Logstash 配置文件,从标准输入读取数据并输出到 Elasticsearch:

# 创建配置文件
vim /etc/logstash/conf.d/stdin_to_es.conf

# 配置内容
input {
  stdin {
    codec => "json"
  }
}

filter {
  # 可以添加过滤规则
}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "logstash-stdin-%{+YYYY.MM.dd}"
  }
  stdout { codec => rubydebug }  # 同时输出到控制台
}
2.4.3 启动并验证 Logstash
# 测试配置文件
/usr/share/logstash/bin/logstash --config.test_and_exit -f /etc/logstash/conf.d/stdin_to_es.conf

# 启动Logstash(测试模式)
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/stdin_to_es.conf

# 作为服务启动
systemctl start logstash
systemctl enable logstash

# 检查服务状态
systemctl status logstash

2.5 Filebeat 安装与配置

Filebeat 是轻量级日志收集器,用于替代 Logstash 在边缘节点的日志收集工作。

2.5.1 安装 Filebeat
# CentOS安装
yum install -y filebeat

# Ubuntu安装
apt install -y filebeat
2.5.2 配置 Filebeat

配置 Filebeat 收集系统日志并发送到 Elasticsearch:

# 编辑配置文件
vim /etc/filebeat/filebeat.yml

# 配置输入
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/messages
    - /var/log/secure
  tags: ["system"]

# 配置输出到Elasticsearch
output.elasticsearch:
  hosts: ["localhost:9200"]
  index: "filebeat-system-%{+YYYY.MM.dd}"

# 可选:配置输出到Logstash
# output.logstash:
#   hosts: ["localhost:5044"]

# 启用Kibana仪表盘加载
setup.kibana:
  host: "localhost:5601"

# 加载系统模块
setup.module:
  system:
    enabled: true
2.5.3 启动并验证 Filebeat
# 加载仪表盘模板
filebeat setup --dashboards

# 启动服务
systemctl start filebeat
systemctl enable filebeat

# 检查服务状态
systemctl status filebeat

三、ELK Stack 核心配置

3.1 Elasticsearch 核心配置

Elasticsearch 的主要配置文件为/etc/elasticsearch/elasticsearch.yml,关键配置项:

# 集群配置
cluster.name: elk-cluster
node.name: ${HOSTNAME}
node.master: true  # 是否可作为主节点
node.data: true    # 是否存储数据

# 路径配置
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch

# 网络配置
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300  # 节点间通信端口

# 发现与集群形成
discovery.seed_hosts: ["es-node1.example.com", "es-node2.example.com"]
cluster.initial_master_nodes: ["es-node1.example.com"]

# 安全配置(基础)
xpack.security.enabled: false  # 生产环境建议开启
# xpack.security.transport.ssl.enabled: true

# 索引生命周期管理
action.auto_create_index: .monitoring*,*  # 自动创建索引规则

# 内存配置
bootstrap.memory_lock: true

3.2 Logstash 管道配置

Logstash 使用管道配置定义数据处理流程,由 input、filter 和 output 三部分组成:

3.2.1 多输入配置
# /etc/logstash/conf.d/multiple_inputs.conf
input {
  # 文件输入
  file {
    path => "/var/log/nginx/access.log"
    start_position => "beginning"
    sincedb_path => "/dev/null"  # 每次重启都从头读取(测试用)
    tags => ["nginx", "access"]
    type => "nginx-access"
  }
  
  # 系统日志输入
  syslog {
    port => 514
    type => "syslog"
  }
  
  # Beats输入
  beats {
    port => 5044
  }
}

filter {
  # 对nginx日志进行解析
  if [type] == "nginx-access" {
    grok {
      match => { "message" => '%{NGINXACCESS}' }
    }
    date {
      match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
      target => "@timestamp"
    }
    geoip {
      source => "clientip"
    }
  }
}

output {
  # 根据类型输出到不同索引
  if [type] == "nginx-access" {
    elasticsearch {
      hosts => ["http://localhost:9200"]
      index => "nginx-access-%{+YYYY.MM.dd}"
    }
  } else if [type] == "syslog" {
    elasticsearch {
      hosts => ["http://localhost:9200"]
      index => "syslog-%{+YYYY.MM.dd}"
    }
  } else {
    elasticsearch {
      hosts => ["http://localhost:9200"]
      index => "logstash-%{+YYYY.MM.dd}"
    }
  }
  
  # 控制台输出(调试用)
  stdout { codec => rubydebug }
}
3.2.2 常用过滤器
  1. Grok 过滤器:解析非结构化日志为结构化数据
filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }  # 匹配Apache日志
    # 自定义模式
    match => { "message" => "%{TIMESTAMP_ISO8601:logtime} %{LOGLEVEL:loglevel} \[%{DATA:thread}\] %{DATA:class} - %{GREEDYDATA:msg}" }
    patterns_dir => ["/etc/logstash/patterns"]  # 自定义模式文件目录
    tag_on_failure => ["_grokparsefailure"]  # 解析失败时添加标签
  }
}

    2. Date 过滤器:解析日志中的时间戳

filter {
  date {
    match => [ "logtime", "yyyy-MM-dd HH:mm:ss.SSS", "ISO8601" ]  # 匹配多种格式
    target => "@timestamp"  # 存储到@timestamp字段
    timezone => "Asia/Shanghai"  # 指定时区
  }
}

    3. Mutate 过滤器:修改字段

filter {
  mutate {
    rename => { "old_field" => "new_field" }  # 重命名字段
    add_field => { "new_field" => "static_value" }  # 添加字段
    update => { "existing_field" => "new_value" }  # 更新字段
    remove_field => [ "message", "logtime" ]  # 删除字段
    convert => { "response_time" => "float" }  # 转换字段类型
    gsub => [ "message", "password=\w+", "password=***" ]  # 替换敏感信息
  }
}

    4. GeoIP 过滤器:根据 IP 地址添加地理位置信息

filter {
  geoip {
    source => "clientip"  # 源IP字段
    target => "geo"       # 结果存储字段
    database => "/etc/logstash/geoip/GeoLite2-City.mmdb"  # 自定义数据库
  }
}

3.3 Filebeat 配置详解

Filebeat 配置文件/etc/filebeat/filebeat.yml的核心配置:

# 输入配置
filebeat.inputs:
- type: log                  # 输入类型(log、stdin、tcp等)
  enabled: true              # 是否启用
  paths:                     # 日志文件路径
    - /var/log/*.log
    - /var/log/nginx/*.log
  exclude_files: ['\.gz$']   # 排除的文件
  tags: ["system", "nginx"]  # 标签
  fields:                    # 自定义字段
    environment: production
    service: webserver
  fields_under_root: false   # 自定义字段是否在根级别
  scan_frequency: 10s        # 扫描新文件的频率
  harvester_buffer_size: 16384  # 收割机缓冲区大小
  max_bytes: 10485760        # 单个日志条目最大字节数
  multiline.type: pattern    # 多行日志处理
  multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'  # 多行匹配模式
  multiline.negate: true     # 是否否定匹配
  multiline.match: after     # 匹配后如何处理

# 模块配置(预定义的日志类型处理)
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml  # 模块配置路径
  reload.enabled: false                 # 是否自动重载

# 输出配置
output.elasticsearch:
  hosts: ["localhost:9200"]             # Elasticsearch地址
  index: "filebeat-%{[fields.environment]}-%{+YYYY.MM.dd}"  # 索引名称
  username: ${ELASTICSEARCH_USERNAME}   # 用户名
  password: ${ELASTICSEARCH_PASSWORD}   # 密码
  ssl.enabled: true                     # 是否启用SSL
  ssl.certificate_authorities: ["/etc/filebeat/certs/ca.crt"]  # CA证书

# 或输出到Logstash
# output.logstash:
#   hosts: ["localhost:5044"]
#   loadbalance: true                    # 是否负载均衡
#   worker: 2                            # 工作线程数

# 处理器配置(在发送前处理事件)
processors:
  - add_host_metadata:                   # 添加主机元数据
      when.not.contains.tags: forwarded
  - add_cloud_metadata: ~                # 添加云服务元数据
  - add_docker_metadata: ~               # 添加Docker元数据
  - add_kubernetes_metadata: ~           # 添加Kubernetes元数据
  - drop_fields:                         # 删除字段
      fields: ["beat", "input", "source"]
  - dissect:                             # 解析字段
      tokenizer: "%{key1}=%{value1};%{key2}=%{value2}"
      field: "message"
      target_prefix: "dissect"

# 日志配置
logging.level: info                     # 日志级别
logging.to_files: true                  # 是否输出到文件
logging.files:
  path: /var/log/filebeat
  name: filebeat
  keepfiles: 7
  permissions: 0644

# Kibana配置(用于设置仪表盘)
setup.kibana:
  host: "localhost:5601"
  username: ${KIBANA_USERNAME}
  password: ${KIBANA_PASSWORD}

# 索引生命周期管理
setup.ilm:
  enabled: true
  policy_name: "filebeat-policy"
  rollover_alias: "filebeat"
3.3.1 Filebeat 模块配置

Filebeat 提供多种预定义模块,简化常见日志类型的处理:

# 列出可用模块
filebeat modules list

# 启用Nginx模块
filebeat modules enable nginx

# 禁用Nginx模块
filebeat modules disable nginx

配置模块:

# /etc/filebeat/modules.d/nginx.yml
- module: nginx
  access:
    enabled: true
    var.paths: ["/var/log/nginx/access.log*"]  # 日志路径
  error:
    enabled: true
    var.paths: ["/var/log/nginx/error.log*"]   # 日志路径
  ingress_controller:
    enabled: false  # 禁用Ingress Controller日志收集

3.4 Kibana 使用指南

3.4.1 索引模式创建
  1. 登录 Kibana 控制台(http://<kibana-host>:5601)
  2. 进入Management > Stack Management > Index Patterns
  3. 点击Create index pattern
  4. 输入索引模式(如nginx-access-*)
  5. 选择时间字段(通常为@timestamp)
  6. 点击Create index pattern
3.4.2 发现与搜索

Discover页面可以搜索和浏览日志数据:

  • 使用 KQL(Kibana Query Language)搜索:
    • response:500 - 查找响应码为 500 的日志
    • clientip:192.168.1.* - 查找特定 IP 段的客户端
    • method:GET AND response:200 - 组合条件
    • url:"/api/users/*" - 通配符匹配
  • 时间范围过滤:通过右上角时间选择器设置
3.4.3 可视化创建

Visualize Library页面创建可视化图表:

  1. 点击Create visualization
  2. 选择可视化类型(如 Line chart、Bar chart、Pie chart 等)
  3. 选择索引模式
  4. 配置 X 轴、Y 轴和聚合方式:
    • 对于访问量趋势:X 轴选择@timestamp(按小时聚合),Y 轴选择Count
    • 对于状态码分布:使用Terms聚合,字段选择response

5. 保存可视化

3.4.4 仪表盘创建

Dashboard页面创建仪表盘:

  1. 点击Create dashboard
  2. 点击Add添加已创建的可视化
  3. 调整图表位置和大小
  4. 设置自动刷新时间
  5. 保存仪表盘

四、ELK Stack 安全配置

4.1 Elasticsearch 安全配置

启用 Elasticsearch 安全功能(X-Pack Security):

# /etc/elasticsearch/elasticsearch.yml
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

设置内置用户密码:

# 自动生成随机密码
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto

# 或手动设置密码
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive

创建自定义用户:

# 使用Kibana控制台或API创建用户
# 示例:创建具有管理员权限的用户
curl -X POST "http://localhost:9200/_security/user/admin" \
  -H "Content-Type: application/json" \
  -u elastic:elastic_password \
  -d '{
    "password" : "admin_password",
    "roles" : ["superuser"],
    "full_name" : "Administrator"
  }'

4.2 Kibana 安全配置

配置 Kibana 使用 Elasticsearch 认证:

# /etc/kibana/kibana.yml
elasticsearch.username: "kibana_system"
elasticsearch.password: "kibana_system_password"
xpack.security.enabled: true
xpack.monitoring.ui.container.elasticsearch.enabled: true

设置 Kibana 空间和角色:

  1. 登录 Kibana(使用 elastic 用户)
  2. 进入Management > Stack Management > Security > Spaces创建空间
  3. 进入Roles创建自定义角色,分配权限
  4. 进入Users创建用户并分配角色

4.3 加密通信配置

配置 Elasticsearch、Kibana 和 Filebeat 之间的 SSL/TLS 通信:

# 创建证书颁发机构
/usr/share/elasticsearch/bin/elasticsearch-certutil ca

# 生成证书
/usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12

# 配置Elasticsearch SSL
cp elastic-certificates.p12 /etc/elasticsearch/certs/
chown elasticsearch:elasticsearch /etc/elasticsearch/certs/*
# Elasticsearch SSL配置
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.http.ssl.truststore.path: certs/elastic-certificates.p12
# Kibana SSL配置
server.ssl.enabled: true
server.ssl.certificate: /etc/kibana/certs/kibana.crt
server.ssl.key: /etc/kibana/certs/kibana.key
elasticsearch.ssl.certificateAuthorities: ["/etc/kibana/certs/ca.crt"]

五、ELK Stack 实战案例

5.1 Nginx 日志分析平台

5.1.1 架构设计
Nginx服务器 → Filebeat → Logstash → Elasticsearch → Kibana
5.1.2 配置 Filebeat 收集 Nginx 日志
# /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log
  tags: ["nginx", "access"]
  fields:
    log_type: nginx_access

- type: log
  enabled: true
  paths:
    - /var/log/nginx/error.log
  tags: ["nginx", "error"]
  fields:
    log_type: nginx_error

output.logstash:
  hosts: ["logstash-host:5044"]
5.1.3 配置 Logstash 处理 Nginx 日志
# /etc/logstash/conf.d/nginx.conf
input {
  beats {
    port => 5044
  }
}

filter {
  if [fields][log_type] == "nginx_access" {
    grok {
      match => { "message" => '%{NGINXACCESS}' }
    }
    date {
      match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]
      target => "@timestamp"
    }
    geoip {
      source => "clientip"
    }
    useragent {
      source => "agent"
      target => "user_agent"
    }
    mutate {
      convert => {
        "bytes" => "integer"
        "response" => "integer"
        "responsetime" => "float"
      }
      remove_field => ["message", "timestamp", "agent"]
    }
  } else if [fields][log_type] == "nginx_error" {
    grok {
      match => { "message" => '(?<timestamp>\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}) \[%{LOGLEVEL:loglevel}\] %{NUMBER:pid:int}#%{NUMBER:tid:int}: %{GREEDYDATA:error_message}(?:, client: %{IP:clientip})?(?:, server: %{DATA:server})?(?:, request: "%{DATA:request}")?(?:, host: "%{DATA:host}")?(?:, referrer: "%{DATA:referrer}")?' }
    }
    date {
      match => ["timestamp", "yyyy/MM/dd HH:mm:ss"]
      target => "@timestamp"
    }
    mutate {
      remove_field => ["message", "timestamp"]
    }
  }
}

output {
  elasticsearch {
    hosts => ["elasticsearch-host:9200"]
    index => "nginx-%{[fields][log_type]}-%{+YYYY.MM.dd}"
    user => "elastic"
    password => "elastic_password"
  }
  stdout { codec => rubydebug }
}
5.1.4 创建 Kibana 可视化和仪表盘
  1. 创建索引模式nginx-*-*
  2. 创建访问量趋势图(Line chart):
    • X 轴:@timestamp(按小时聚合)
    • Y 轴:Count

     3. 创建状态码分布(Pie chart):

    • 聚合:Terms
    • 字段:response

     4. 创建客户端地理位置分布(Tile map):

    • 坐标字段:geoip.location

     5. 创建响应时间分布(Histogram):

    • X 轴:responsetime
    • 间隔:0.1

     6. 将以上可视化添加到仪表盘

5.2 应用程序日志集中管理

5.2.1 架构设计
应用服务器 → Filebeat → Elasticsearch → Kibana
5.2.2 配置 Filebeat 收集 JSON 格式日志
# /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/app/*.log
  json.keys_under_root: true  # JSON字段放在根级别
  json.overwrite_keys: true   # 覆盖已有字段
  fields:
    service: myapp
    environment: production

output.elasticsearch:
  hosts: ["elasticsearch-host:9200"]
  index: "app-%{[fields.service]}-%{+YYYY.MM.dd}"
  username: "filebeat_writer"
  password: "password"
setup.template.name: "app-logs"
setup.template.pattern: "app-*"
setup.template.enabled: false
setup.template.overwrite: true
5.2.3 在 Kibana 中分析应用日志
  1. 创建索引模式app-*
  2. 设置日志等级过滤器:loglevel: ERROR
  3. 创建错误趋势图:按时间和日志级别聚合
  4. 设置告警:当 ERROR 级别日志在 5 分钟内超过 10 条时触发告警

六、ELK Stack 扩展与优化

6.1 Elasticsearch 集群扩展

配置 Elasticsearch 集群以提高可用性和性能:

# 节点1(主节点和数据节点)
cluster.name: elk-cluster
node.name: es-node-1
node.master: true
node.data: true
network.host: 192.168.1.101
discovery.seed_hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"]
cluster.initial_master_nodes: ["es-node-1", "es-node-2"]

# 节点2(主节点和数据节点)
cluster.name: elk-cluster
node.name: es-node-2
node.master: true
node.data: true
network.host: 192.168.1.102
discovery.seed_hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"]
cluster.initial_master_nodes: ["es-node-1", "es-node-2"]

# 节点3(仅数据节点)
cluster.name: elk-cluster
node.name: es-node-3
node.master: false
node.data: true
network.host: 192.168.1.103
discovery.seed_hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"]

检查集群健康状态:

curl -X GET "http://localhost:9200/_cluster/health?pretty" -u elastic:password

6.2 索引生命周期管理

配置索引生命周期策略自动管理索引:

  1. 在 Kibana 中进入Management > Stack Management > Index Lifecycle Policies
  2. 创建策略:
    • 热阶段:存储最新数据,允许写入和查询
    • 温阶段:数据不再写入,仅查询,可压缩
    • 冷阶段:很少查询的数据,进一步压缩
    • 删除阶段:过期数据自动删除

     3. 应用策略到索引模板

示例 ILM 策略配置:

{
  "policy": {
    "phases": {
      "hot": {
        "min_age": "0ms",
        "actions": {
          "rollover": {
            "max_age": "1d",
            "max_size": "50gb"
          },
          "set_priority": {
            "priority": 100
          }
        }
      },
      "warm": {
        "min_age": "7d",
        "actions": {
          "shrink": {
            "number_of_shards": 1
          },
          "forcemerge": {
            "max_num_segments": 1
          },
          "set_priority": {
            "priority": 50
          }
        }
      },
      "cold": {
        "min_age": "30d",
        "actions": {
          "freeze": {},
          "set_priority": {
            "priority": 10
          }
        }
      },
      "delete": {
        "min_age": "90d",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}

6.3 性能优化

6.3.1 Elasticsearch 性能优化
  1. JVM 配置优化
# /etc/elasticsearch/jvm.options
-Xms16g  # 初始堆大小
-Xmx16g  # 最大堆大小(不超过物理内存的50%,且不超过31GB)
-XX:+UseG1GC  # 使用G1垃圾收集器
-XX:G1ReservePercent=25  # 保留内存百分比

     2. 索引优化

# 索引模板优化
{
  "index_patterns": ["logs-*"],
  "settings": {
    "number_of_shards": 3,  # 主分片数量(根据节点数调整)
    "number_of_replicas": 1,  # 副本数量
    "refresh_interval": "30s",  # 刷新间隔(提高写入性能)
    "translog.durability": "async",  # 异步提交translog
    "translog.flush_threshold_size": "1gb"  # translog刷新阈值
  }
}

     3. 操作系统优化

# 禁用swap
swapoff -a
# 永久禁用swap(编辑/etc/fstab注释swap行)

# 配置网络
echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf
echo "net.ipv4.tcp_tw_recycle = 1" >> /etc/sysctl.conf
sysctl -p
6.3.2 Logstash 性能优化
# /etc/logstash/jvm.options
-Xms4g
-Xmx4g

# 管道工作线程配置
pipeline.workers: 4  # 通常设置为CPU核心数
pipeline.batch.size: 1000
pipeline.batch.delay: 50
6.3.3 Filebeat 性能优化
# /etc/filebeat/filebeat.yml
filebeat.registry.flush: 5s  # 注册表刷新间隔
queue.mem:
  events: 4096  # 内存队列大小
  flush.min_events: 512  # 刷新最小事件数
  flush.timeout: 5s  # 刷新超时

6.4 与其他工具集成

6.4.1 与 Kubernetes 集成
# Filebeat DaemonSet 配置示例
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: filebeat
  namespace: kube-system
spec:
  selector:
    matchLabels:
      app: filebeat
  template:
    metadata:
      labels:
        app: filebeat
    spec:
      serviceAccountName: filebeat
      terminationGracePeriodSeconds: 30
      containers:
      - name: filebeat
        image: docker.elastic.co/beats/filebeat:7.14.0
        args: [
          "-c", "/etc/filebeat.yml",
          "-e",
        ]
        volumeMounts:
        - name: config
          mountPath: /etc/filebeat.yml
          subPath: filebeat.yml
        - name: data
          mountPath: /usr/share/filebeat/data
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
      volumes:
      - name: config
        configMap:
          defaultMode: 0600
          name: filebeat-config
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers
      - name: data
        hostPath:
          path: /var/lib/filebeat-data
          type: DirectoryOrCreate
6.4.2 与 Prometheus 集成
# prometheus.yml 配置
scrape_configs:
  - job_name: 'elasticsearch'
    metrics_path: '/_prometheus/metrics'
    static_configs:
      - targets: ['elasticsearch-host:9200']
  
  - job_name: 'kibana'
    metrics_path: '/metrics'
    static_configs:
      - targets: ['kibana-host:5601']

在 Kibana 中安装 Prometheus 插件,实现 metrics 数据可视化。

七、最佳实践与总结

7.1 最佳实践

  1. 部署架构
    • 小规模部署:单节点 ELK Stack
    • 中大规模:Elasticsearch 集群 + 独立 Logstash 节点 + 独立 Kibana 节点
    • 超大规模:引入 Kafka 作为缓冲层,实现解耦和峰值处理

     2. 安全实践

    • 启用 X-Pack Security 保护敏感数据
    • 配置 SSL/TLS 加密所有组件间通信
    • 实施最小权限原则,为不同组件创建专用用户
    • 定期轮换证书和密码

     3. 数据管理

    • 使用索引生命周期管理自动处理过期数据
    • 根据日志重要性设置不同的保留策略
    • 对敏感日志数据进行脱敏处理
    • 定期备份重要索引

     4. 监控与告警

    • 监控 ELK Stack 自身健康状态
    • 设置关键指标告警(如磁盘使用率、集群健康状态、错误率)
    • 监控日志处理延迟,确保及时发现处理瓶颈

7.2 总结

ELK Stack 作为一套完整的日志管理解决方案,通过 Elasticsearch、Logstash、Kibana 和 Beats 的协同工作,提供了从日志收集、处理、存储到分析和可视化的全流程能力。其主要优势包括:

  • 强大的全文检索能力,支持复杂查询和过滤
  • 灵活的日志处理管道,可应对各种日志格式和转换需求
  • 丰富的可视化选项,帮助用户从海量日志中发现有价值的信息
  • 高度可扩展的架构,可从单节点部署扩展到大规模集群
  • 活跃的社区和丰富的插件生态,不断扩展功能边界

在实际应用中,应根据业务需求和规模选择合适的部署架构,并遵循最佳实践进行配置和优化。随着云原生和微服务架构的普及,ELK Stack 与容器平台、云服务的集成将更加紧密,成为现代运维和监控体系中不可或缺的组成部分。

通过合理使用 ELK Stack,组织可以实现日志数据的集中管理,提高故障排查效率,增强系统安全性,为业务决策提供数据支持,最终提升整体 IT 运营效率和业务连续性。


网站公告

今日签到

点亮在社区的每一天
去签到