ELK+Filebeat 集群详细部署文档(V7.8.1 版本

一、部署环境说明

1.1 服务器基础信息

节点名称 IP 地址 部署组件 建议硬件配置
node1 192.168.10.26 Elasticsearch(集群节点)、Kibana 2C/4G 及以上
node2 192.168.10.27 Elasticsearch(集群节点) 2C/4G 及以上
apache 192.168.10.25 Logstash、Apache(httpd) 2C/2G 及以上
filebeat 192.168.10.28 Filebeat 1C/1G 及以上

1.2 软件版本说明(统一为 7.8.1,确保兼容性)

  • Elasticsearch:7.8.1
  • Logstash:7.8.1
  • Kibana:7.8.1
  • Filebeat:7.8.1
  • Java:OpenJDK 1.8.0_131(7.8.1 兼容 Java 8/11,推荐 Java 8)
  • Apache:httpd 2.4(系统默认版本)

1.3 软件下载地址(官方源,自行下载后上传至各节点 /opt 目录)

1.4 部署前提

  • 所有服务器为 CentOS 7/8 系统,已配置网络连接;
  • 软件包已上传至对应节点的 /opt 目录;
  • 全程使用 root 用户操作(或配置 sudo 权限)。

二、基础环境配置(所有节点执行)

2.1 关闭防火墙与 SELinux

bash

运行

复制代码
# 关闭防火墙并禁用开机自启
systemctl stop firewalld
systemctl disable firewalld

# 关闭SELinux(临时+永久)
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

# 验证(输出 Permissive 或 Disabled 即为成功)
getenforce

2.2 配置主机名与域名解析

2.2.1 更改主机名

bash

运行

复制代码
# node1节点(192.168.10.26)
hostnamectl set-hostname node1

# node2节点(192.168.10.27)
hostnamectl set-hostname node2

# apache节点(192.168.10.25)
hostnamectl set-hostname apache

# filebeat节点(192.168.10.28)
hostnamectl set-hostname filebeat
2.2.2 配置跨节点解析

所有节点编辑 /etc/hosts,添加以下内容:

bash

运行

复制代码
vim /etc/hosts
192.168.10.26 node1
192.168.10.27 node2
192.168.10.25 apache
192.168.10.28 filebeat

2.3 安装 Java 环境与基础依赖

bash

运行

复制代码
# 安装Java 8
yum -y install java

# 验证Java版本(输出1.8.x即为成功)
java -version

# 安装基础依赖工具
yum install -y gcc gcc-c++ make wget vim net-tools netstat-netlink

2.4 配置系统参数(Elasticsearch 必需,所有 ES 节点执行)

bash

运行

复制代码
# 调整文件描述符和线程限制
cat >> /etc/security/limits.conf << EOF
* soft nofile 65535
* hard nofile 65535
* soft nproc 4096
* hard nproc 4096
EOF

# 调整虚拟内存(ES要求vm.max_map_count≥262144)
cat >> /etc/sysctl.conf << EOF
vm.max_map_count = 262144
EOF

# 使配置生效
sysctl -p

三、Elasticsearch 集群部署(node1、node2 节点操作)

3.1 安装 Elasticsearch 7.8.1

bash

运行

复制代码
# 进入软件包目录
cd /opt

# 安装RPM包
rpm -ivh elasticsearch-7.8.1-x86_64.rpm

# 加载系统服务并设置开机自启
systemctl daemon-reload
systemctl enable elasticsearch.service

3.2 配置 Elasticsearch(7.8.1 版本适配)

3.2.1 备份并编辑配置文件

bash

运行

复制代码
# 备份原始配置
cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak

# 编辑配置文件
vim /etc/elasticsearch/elasticsearch.yml
3.2.2 node1 节点(192.168.10.26)配置内容

yaml

复制代码
# 集群名称(所有节点一致)
cluster.name: my-elk-cluster

# 节点名称(唯一)
node.name: node1

# 节点角色(7.x版本推荐用node.roles配置)
node.roles: [master, data, ingest]

# 数据存储路径
path.data: /data/elk_data

# 日志存储路径
path.logs: /var/log/elasticsearch/

# 禁用内存锁定
bootstrap.memory_lock: false

# 监听地址(允许所有访问)
network.host: 0.0.0.0

# HTTP端口(默认9200)
http.port: 9200

# 集群发现(单播模式,指定所有ES节点)
discovery.seed_hosts: ["node1", "node2"]

# 初始主节点候选(首次启动指定)
cluster.initial_master_nodes: ["node1", "node2"]

# 跨域配置(适配head插件和Kibana)
http.cors.enabled: true
http.cors.allow-origin: "*"
3.2.3 node2 节点(192.168.10.27)配置内容

仅节点名称不同,其余与 node1 一致:

yaml

复制代码
node.name: node2
# 其余配置与node1完全相同

3.3 创建数据目录并授权

bash

运行

复制代码
# 创建数据目录
mkdir -p /data/elk_data

# 赋予Elasticsearch用户权限
chown -R elasticsearch:elasticsearch /data/elk_data/
chown -R elasticsearch:elasticsearch /etc/elasticsearch/

3.4 启动 ES 集群并验证

bash

运行

复制代码
# 启动服务
systemctl start elasticsearch.service

# 验证端口监听(9200端口启动即为成功)
netstat -antp | grep 9200

# 集群健康状态验证(浏览器访问,green为健康)
http://192.168.10.26:9200/_cluster/health?pretty

四、Elasticsearch-head 插件安装(node1 节点操作)

4.1 安装 node.js

bash

运行

复制代码
cd /opt
tar zxvf node-v8.2.1.tar.gz
cd node-v8.2.1/
./configure
make && make install

# 验证(输出版本号即为成功)
node -v
npm -v

4.2 安装 phantomjs

bash

yum install bzip2 -y 安装解压bz2的工具

复制代码
cd /opt
tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/src/
cp /usr/local/src/phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin/

# 验证
phantomjs -v

4.3 安装并启动 head 插件

bash

运行

复制代码
cd /opt
# 解压head插件(若下载的是master包,重命名为elasticsearch-head)
tar zxvf elasticsearch-head.tar.gz -C /usr/local/src/
cd /usr/local/src/elasticsearch-head/

# 安装依赖
npm install

# 后台启动(监听9100端口)
npm run start &

# 验证访问(浏览器访问,连接ES集群)
http://192.168.10.26:9100/

五、Logstash 部署(apache 节点:192.168.10.25 操作)

5.1 安装 Apache 服务

bash

运行

复制代码
yum -y install httpd
systemctl start httpd
systemctl enable httpd

# 验证(访问默认页面)
curl http://192.168.10.25

5.2 安装 Logstash 7.8.1

bash

运行

复制代码
cd /opt
rpm -ivh logstash-7.8.1.rpm

# 启动服务并设置开机自启(后续需重启,先初始化)
systemctl start logstash.service
systemctl enable logstash.service

# 创建软链接
ln -s /usr/share/logstash/bin/logstash /usr/local/bin/

5.3 创建整合配置文件(同时采集 Apache+Filebeat 日志)

bash

运行

复制代码
# 进入配置目录
cd /etc/logstash/conf.d
rm -f *.conf  # 清理原有配置

# 新建整合配置文件
vim all-log.conf

配置内容如下(7.8.1 语法兼容):

ruby

复制代码
# 输入模块:Apache日志 + Filebeat日志
input {
  # 1. Apache访问日志
  file {
    path => "/var/log/httpd/access_log"
    type => "access"
    start_position => "beginning"
  }
  # 2. Apache错误日志
  file {
    path => "/var/log/httpd/error_log"
    type => "error"
    start_position => "beginning"
  }
  # 3. 接收Filebeat日志(监听5044端口)
  beats {
    port => "5044"
  }
}

# 输出模块:按日志类型分索引输出到ES集群
output {
  # Apache访问日志 → apache_access-日期
  if [type] == "access" {
    elasticsearch {
      hosts => ["192.168.10.26:9200", "192.168.10.27:9200"]
      index => "apache_access-%{+YYYY.MM.dd}"
    }
  }
  # Apache错误日志 → apache_error-日期
  if [type] == "error" {
    elasticsearch {
      hosts => ["192.168.10.26:9200", "192.168.10.27:9200"]
      index => "apache_error-%{+YYYY.MM.dd}"
    }
  }
  # Filebeat日志 → filebeat-日期
  if [fields][service_name] == "filebeat" {
    elasticsearch {
      hosts => ["192.168.10.26:9200", "192.168.10.27:9200"]
      index => "%{[fields][service_name]}-%{+YYYY.MM.dd}"
    }
  }
  # 控制台调试输出(可选,生产环境可注释)
  stdout {
    codec => rubydebug
  }
}

5.4 停止默认服务,启动整合配置

bash

运行

复制代码
# 停止默认Logstash服务(避免冲突)
systemctl stop logstash
systemctl disable logstash

# 验证配置语法
logstash -f /etc/logstash/conf.d/all-log.conf --config.test_and_exit

# 后台启动(日志输出到nohup.out)
nohup logstash -f /etc/logstash/conf.d/all-log.conf &

# 查看启动日志
tail -f nohup.out

六、Kibana 部署(node1 节点:192.168.10.26 操作)

6.1 安装 Kibana 7.8.1

bash

运行

复制代码
cd /opt
rpm -ivh kibana-7.8.1-x86_64.rpm

6.2 配置 Kibana

bash

运行

复制代码
vim /etc/kibana/kibana.yml

# 配置内容
server.port: 5601                # 监听端口
server.host: "0.0.0.0"           # 允许外部访问
elasticsearch.hosts: ["http://192.168.10.26:9200"]  # 连接ES
kibana.index: ".kibana"          # ES中Kibana索引
i18n.locale: "zh-CN"             # 中文界面(7.8.1支持原生中文)

6.3 启动 Kibana 并验证

bash

运行

复制代码
# 启动服务并设置开机自启
systemctl start kibana.service
systemctl enable kibana.service

# 验证端口(5601端口监听即为成功)
netstat -antp | grep 5601

# 浏览器访问
http://192.168.10.26:5601

6.4 创建 Kibana 索引模式

  1. 访问 Kibana → 【Management】→【索引模式】→【创建索引模式】;
  2. 分别创建 3 个索引模式:
    • apache_access-* → 时间字段选@timestamp
    • apache_error-* → 时间字段选@timestamp
    • filebeat-* → 时间字段选@timestamp
  3. 【Discover】中切换索引模式查看对应日志。

七、Filebeat 部署(filebeat 节点:192.168.10.28 操作)

7.1 安装 Filebeat 7.8.1(RPM 方式推荐)

bash

运行

复制代码
cd /opt
rpm -ivh filebeat-7.8.1-x86_64.rpm

# 验证版本
filebeat version

7.2 配置 Filebeat(7.x 版本适配:filebeat.inputs 替代 prospectors)

bash

运行

复制代码
# 备份原始配置
cp /etc/filebeat/filebeat.yml /etc/filebeat/filebeat.yml.bak

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

配置内容如下(严格遵循 YAML 语法):

yaml

复制代码
# ============================== Filebeat Inputs ===============================
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/messages
    - /var/log/*.log
  fields:
    service_name: filebeat
    log_type: system_log
    service_id: 192.168.10.28
  fields_under_root: false

# ============================== Elasticsearch Output ===============================
output.elasticsearch:
  enabled: false  # 禁用直接输出到ES

# ============================== Logstash Output ===============================
output.logstash:
  enabled: true
  hosts: ["192.168.10.25:5044"]  # 指向Logstash节点

# ============================== Logging ===============================
logging.level: info
logging.to_files: true
logging.files:
  path: /var/log/filebeat
  name: filebeat.log
  keepfiles: 7
  permissions: 0644

7.3 验证配置并启动 Filebeat

bash

运行

复制代码
# 验证配置语法(无报错则通过)
filebeat test config -c /etc/filebeat/filebeat.yml

# 启动服务并设置开机自启
systemctl start filebeat
systemctl enable filebeat

# 查看启动日志
journalctl -u filebeat -f

八、整体验证(确保日志流转正常)

1. 生成测试日志

  • Apache 节点curl http://192.168.10.25(生成访问日志);
  • Filebeat 节点logger "filebeat 7.8.1 测试日志:$(date)"(生成系统日志)。

2. 验证 ES 索引

浏览器访问 http://192.168.10.26:9200/_cat/indices?v,可见 apache_access-*filebeat-* 索引。

3. Kibana 查看日志

访问 http://192.168.10.26:5601 → 【Discover】,切换对应索引模式,即可看到测试日志。

九、常见问题排查

1. ES 启动失败

  • 查看日志:tail -f /var/log/elasticsearch/my-elk-cluster.log
  • 常见原因:数据目录权限不足、虚拟内存参数未生效(重启服务器)、端口被占用。

2. Filebeat 语法错误

  • 核心原因:缩进用 Tab 键、冒号后未加空格;
  • 解决:用 sed -i 's/\t/ /g' /etc/filebeat/filebeat.yml 替换 Tab 为空格,严格按示例配置书写。

3. Logstash 进程冲突

  • 解决:systemctl stop logstash 停止默认服务,pkill -f logstash 清理残留进程,再启动整合配置。

十、部署总结

  • 所有组件统一为 7.8.1 版本,兼容性稳定;
  • Logstash 单实例整合多日志来源,资源占用低、维护简单;
  • Filebeat 轻量采集,适配 7.x 语法,避免配置报错;
  • Kibana 原生支持中文,可视化操作更便捷

ELK+Filebeat 扩展:采集 MySQL 与 Tomcat 日志(7.8.1 版本适配)

一、核心采集逻辑

新增日志采集遵循「Filebeat 轻量采集 → Logstash 解析过滤 → Elasticsearch 存储 → Kibana 可视化」流程:

  1. Filebeat 部署在 MySQL/Tomcat 所在节点(若部署在现有节点,直接复用;若新增节点,需在新节点安装 Filebeat 并配置域名解析);
  2. 配置 Filebeat 监听 MySQL/Tomcat 日志文件;
  3. Logstash 新增过滤规则(filter 模块),解析非结构化日志(如 MySQL 慢查询、Tomcat 访问日志);
  4. Kibana 创建对应索引模式,可视化展示日志。

二、前提说明

1. 确认 MySQL/Tomcat 部署节点与日志路径

假设 MySQL 和 Tomcat 部署在 filebeat 节点(192.168.10.28)(若部署在其他节点,只需在对应节点重复 Filebeat 配置步骤),常见日志路径如下:

应用 日志类型 常见路径(需根据实际部署调整)
MySQL 慢查询日志 /var/log/mysql/slow.log(RPM 安装)、/data/mysql/slow.log(二进制安装)
MySQL 错误日志 /var/log/mysql/error.log 或 /etc/my.cnf 中指定的 log-error 路径
Tomcat 访问日志 /usr/local/tomcat/logs/localhost_access_log.*.txt
Tomcat 控制台日志 /usr/local/tomcat/logs/catalina.out

2. 权限准备

确保 Filebeat 能读取日志文件(给日志目录授权):

bash

运行

复制代码
# 以 MySQL 日志为例(根据实际路径调整)
chmod -R 755 /var/log/mysql/
chown -R root:root /var/log/mysql/  # Filebeat 默认以 root 运行(RPM安装)

# Tomcat 日志授权(假设 Tomcat 安装在 /usr/local/tomcat)
chmod -R 755 /usr/local/tomcat/logs/
chown -R root:root /usr/local/tomcat/logs/

三、采集 MySQL 日志(以慢查询日志为例,最具分析价值)

步骤 1:开启 MySQL 慢查询日志(若未开启)

  1. 编辑 MySQL 配置文件:

bash

运行

复制代码
vim /etc/my.cnf  # RPM安装路径,二进制安装可能为 /etc/my.cnf.d/mysql-server.cnf
  1. 添加以下配置(开启慢查询日志):

ini

复制代码
[mysqld]
slow_query_log = 1  # 开启慢查询日志
slow_query_log_file = /var/log/mysql/slow.log  # 慢查询日志路径(确保目录存在)
long_query_time = 2  # 执行时间超过 2 秒的查询记录为慢查询
log_queries_not_using_indexes = 1  # 记录未使用索引的查询
  1. 重启 MySQL 使配置生效:

bash

运行

复制代码
systemctl restart mysqld
# 验证慢查询日志是否开启
mysql -u root -p -e "show variables like '%slow_query%';"
# 预期输出:slow_query_log = ON

步骤 2:配置 Filebeat 采集 MySQL 日志(filebeat 节点:192.168.10.28)

编辑 Filebeat 配置文件,新增 MySQL 日志采集规则:

bash

运行

复制代码
vim /etc/filebeat/filebeat.yml

filebeat.inputs 中添加以下内容(与原有系统日志采集规则并列):

yaml

复制代码
filebeat.inputs:
# 原有系统日志采集规则(保留)
- type: log
  enabled: true
  paths:
    - /var/log/messages
    - /var/log/*.log
  fields:
    service_name: filebeat
    log_type: system_log
    service_id: 192.168.10.28
  fields_under_root: false

# 新增 MySQL 慢查询日志采集规则
- type: log
  enabled: true
  paths:
    - /var/log/mysql/slow.log  # 替换为实际慢查询日志路径
    - /var/log/mysql/error.log  # 可选:同时采集错误日志
  fields:
    service_name: mysql
    log_type: slow_query  # 慢查询日志标识
    service_id: 192.168.10.28
  fields_under_root: false
  multiline.pattern: '^# Time:'  # 处理慢查询日志多行记录(以 # Time: 开头为新日志)
  multiline.negate: true
  multiline.match: after

步骤 3:配置 Logstash 解析 MySQL 慢查询日志(apache 节点:192.168.10.25)

编辑整合配置文件 all-log.conf,新增 filter 模块解析 MySQL 日志(非结构化 → 结构化):

bash

运行

复制代码
vim /etc/logstash/conf.d/all-log.conf

完整配置如下(新增 filter 节点,针对 MySQL 日志解析):

ruby

复制代码
# 输入模块(保留原有 Apache+Filebeat 配置,无需修改)
input {
  # Apache 日志(原有)
  file {
    path => "/var/log/httpd/access_log"
    type => "access"
    start_position => "beginning"
  }
  file {
    path => "/var/log/httpd/error_log"
    type => "error"
    start_position => "beginning"
  }
  # Filebeat 日志(原有)
  beats {
    port => "5044"
  }
}

# 新增:过滤模块(解析 MySQL 慢查询日志)
filter {
  # 匹配 MySQL 日志(根据 Filebeat 自定义字段 service_name: mysql)
  if [fields][service_name] == "mysql" {
    # 解析 MySQL 慢查询日志(grok 模式适配 MySQL 5.7+/8.0+)
    grok {
      match => { "message" => [
        # 慢查询日志格式:# Time: 2025-12-15T10:00:00.000000Z
        # # User@Host: root[root] @ localhost [127.0.0.1]  Id: 1234
        # # Query_time: 3.200000  Lock_time: 0.000000  Rows_sent: 1  Rows_examined: 1000
        # SELECT * FROM test WHERE id=1;
        "^# Time: %{TIMESTAMP_ISO8601:mysql_time}\n# User@Host: %{USER:mysql_user}\[%{USER:mysql_db_user}\] @ %{HOSTNAME:mysql_host} \[%{IP:mysql_client_ip}\]  Id: %{NUMBER:mysql_thread_id:int}\n# Query_time: %{NUMBER:mysql_query_time:float}  Lock_time: %{NUMBER:mysql_lock_time:float}  Rows_sent: %{NUMBER:mysql_rows_sent:int}  Rows_examined: %{NUMBER:mysql_rows_examined:int}\n%{GREEDYDATA:mysql_sql:sql}"
      ]}
      add_field => { "log_source" => "mysql_slow_query" }  # 新增字段标识日志来源
      remove_field => "message"  # 移除原始消息字段(可选,简化日志)
    }
    # 转换时间格式(适配 ES 时间字段)
    date {
      match => ["mysql_time", "ISO8601"]
      target => "@timestamp"
    }
  }
}

# 输出模块(新增 MySQL 日志索引)
output {
  # Apache 日志(原有)
  if [type] == "access" {
    elasticsearch {
      hosts => ["192.168.10.26:9200", "192.168.10.27:9200"]
      index => "apache_access-%{+YYYY.MM.dd}"
    }
  }
  if [type] == "error" {
    elasticsearch {
      hosts => ["192.168.10.26:9200", "192.168.10.27:9200"]
      index => "apache_error-%{+YYYY.MM.dd}"
    }
  }
  # 系统日志(原有)
  if [fields][service_name] == "filebeat" {
    elasticsearch {
      hosts => ["192.168.10.26:9200", "192.168.10.27:9200"]
      index => "filebeat_system-%{+YYYY.MM.dd}"
    }
  }
  # 新增:MySQL 日志输出(索引名:mysql_slow_query-日期)
  if [fields][service_name] == "mysql" {
    elasticsearch {
      hosts => ["192.168.10.26:9200", "192.168.10.27:9200"]
      index => "mysql_slow_query-%{+YYYY.MM.dd}"
    }
  }
  # 控制台调试(可选)
  stdout {
    codec => rubydebug
  }
}

步骤 4:重启 Filebeat 与 Logstash

bash

运行

复制代码
# Filebeat 节点(192.168.10.28)
systemctl restart filebeat
journalctl -u filebeat -f  # 查看是否有报错

# Logstash 节点(192.168.10.25)
# 先停止原有进程
pkill -f logstash
# 重启整合配置
nohup logstash -f /etc/logstash/conf.d/all-log.conf &
tail -f nohup.out  # 查看解析是否正常

步骤 5:生成 MySQL 测试慢查询

bash

运行

复制代码
# 登录 MySQL,执行一个慢查询(超过 2 秒)
mysql -u root -p
mysql> SELECT SLEEP(3);  # 模拟慢查询(执行时间 3 秒)
mysql> exit;

# 查看慢查询日志是否生成
cat /var/log/mysql/slow.log

四、采集 Tomcat 日志(访问日志 + catalina.out 控制台日志)

步骤 1:确认 Tomcat 日志配置(默认已开启,无需修改)

Tomcat 默认开启访问日志,日志格式为「组合日志格式(Common Log Format)」,路径:/usr/local/tomcat/logs/localhost_access_log.%Y-%m-%d.txt

步骤 2:配置 Filebeat 采集 Tomcat 日志(filebeat 节点:192.168.10.28)

编辑 Filebeat 配置文件,新增 Tomcat 日志采集规则:

bash

运行

复制代码
vim /etc/filebeat/filebeat.yml

filebeat.inputs 中添加以下内容:

yaml

复制代码
filebeat.inputs:
# 原有规则(系统日志、MySQL 日志)保留,新增以下:
# 新增 Tomcat 访问日志采集
- type: log
  enabled: true
  paths:
    - /usr/local/tomcat/logs/localhost_access_log.*.txt  # 访问日志路径
  fields:
    service_name: tomcat
    log_type: access_log  # 访问日志标识
    service_id: 192.168.10.28
  fields_under_root: false

# 新增 Tomcat catalina.out 控制台日志采集(可选)
- type: log
  enabled: true
  paths:
    - /usr/local/tomcat/logs/catalina.out
  fields:
    service_name: tomcat
    log_type: catalina_log  # 控制台日志标识
    service_id: 192.168.10.28
  fields_under_root: false
  multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'  # 处理多行日志(以日期开头为新日志)
  multiline.negate: true
  multiline.match: after

步骤 3:配置 Logstash 解析 Tomcat 日志(apache 节点:192.168.10.25)

编辑 all-log.conf,在 filter 模块新增 Tomcat 日志解析规则:

ruby

复制代码
filter {
  # 原有 MySQL 解析规则保留,新增以下:
  # 解析 Tomcat 访问日志(组合日志格式)
  if [fields][service_name] == "tomcat" and [fields][log_type] == "access_log" {
    grok {
      match => { "message" => '%{IPORHOST:tomcat_client_ip} %{USER:tomcat_auth_user} %{USER:tomcat_remote_user} \[%{HTTPDATE:tomcat_access_time}\] "%{WORD:tomcat_method} %{URIPATH:tomcat_uri}(%{URIPARAM:tomcat_uri_params})? %{DATA:tomcat_protocol}" %{NUMBER:tomcat_status:int} %{NUMBER:tomcat_bytes_sent:int} "%{DATA:tomcat_referer}" "%{DATA:tomcat_user_agent}"' }
      add_field => { "log_source" => "tomcat_access" }
      remove_field => "message"
    }
    # 转换访问时间格式
    date {
      match => ["tomcat_access_time", "dd/MMM/yyyy:HH:mm:ss Z"]
      target => "@timestamp"
    }
  }

  # 解析 Tomcat catalina.out 日志(简单提取日期和级别,可选)
  if [fields][service_name] == "tomcat" and [fields][log_type] == "catalina_log" {
    grok {
      match => { "message" => '%{TIMESTAMP_ISO8601:tomcat_catalina_time} %{LOGLEVEL:tomcat_log_level} \[%{DATA:tomcat_thread}\] %{DATA:tomcat_class} : %{GREEDYDATA:tomcat_catalina_message}' }
      add_field => { "log_source" => "tomcat_catalina" }
    }
    date {
      match => ["tomcat_catalina_time", "ISO8601"]
      target => "@timestamp"
    }
  }

  # 原有 MySQL 解析规则...
}

步骤 4:更新 Logstash 输出模块(新增 Tomcat 索引)

output 节点添加以下内容:

ruby

复制代码
output {
  # 原有输出规则(Apache、系统日志、MySQL)保留,新增:
  # Tomcat 访问日志 → 索引 tomcat_access-日期
  if [fields][service_name] == "tomcat" and [fields][log_type] == "access_log" {
    elasticsearch {
      hosts => ["192.168.10.26:9200", "192.168.10.27:9200"]
      index => "tomcat_access-%{+YYYY.MM.dd}"
    }
  }
  # Tomcat catalina 日志 → 索引 tomcat_catalina-日期
  if [fields][service_name] == "tomcat" and [fields][log_type] == "catalina_log" {
    elasticsearch {
      hosts => ["192.168.10.26:9200", "192.168.10.27:9200"]
      index => "tomcat_catalina-%{+YYYY.MM.dd}"
    }
  }

  # 原有输出规则...
}

步骤 5:重启 Filebeat 与 Logstash

bash

运行

复制代码
# Filebeat 节点
systemctl restart filebeat

# Logstash 节点
pkill -f logstash
nohup logstash -f /etc/logstash/conf.d/all-log.conf &
tail -f nohup.out  # 确认无解析报错

步骤 6:生成 Tomcat 测试日志

bash

运行

复制代码
# 启动 Tomcat(若未启动)
/usr/local/tomcat/bin/startup.sh

# 访问 Tomcat 首页,生成访问日志
curl http://192.168.10.28:8080

# 查看 Tomcat 日志是否生成
cat /usr/local/tomcat/logs/localhost_access_log.$(date +%Y-%m-%d).txt

五、Kibana 可视化 MySQL/Tomcat 日志

步骤 1:创建 Kibana 索引模式

  1. 访问 Kibana(http://192.168.10.26:5601)→ 【Management】→【索引模式】→【创建索引模式】;
  2. 分别创建以下索引模式(匹配 Logstash 输出的索引名):
    • MySQL 慢查询日志:mysql_slow_query-* → 时间字段选 @timestamp
    • Tomcat 访问日志:tomcat_access-* → 时间字段选 @timestamp
    • Tomcat 控制台日志:tomcat_catalina-* → 时间字段选 @timestamp
  3. 点击【创建】完成索引模式配置。

步骤 2:查看与分析日志

  1. 【Discover】→ 切换对应索引模式(如 mysql_slow_query-*);
  2. 可查看解析后的结构化字段(如 mysql_query_time 慢查询时间、mysql_sql 执行的 SQL 语句);
  3. 示例分析场景:
    • 筛选 mysql_query_time > 2 的慢查询,优化对应 SQL;
    • 统计 Tomcat 访问日志中 tomcat_status:500 的错误请求,定位接口问题;
    • tomcat_method 分组,查看 GET/POST 请求占比。

六、常见问题排查

1. Filebeat 无法采集 MySQL/Tomcat 日志

  • 检查日志路径是否正确:filebeat test config -c /etc/filebeat/filebeat.yml 验证配置,确保 paths 字段与实际日志路径一致;
  • 检查权限:ls -l /var/log/mysql/slow.log 确认 Filebeat(root 用户)有读取权限;
  • 查看 Filebeat 日志:journalctl -u filebeat -f,排查「permission denied」等权限报错。

2. Logstash 解析日志失败(Kibana 无结构化字段)

  • 查看 Logstash 日志:tail -f nohup.out,排查 grok 解析报错(如「_grokparsefailure」);
  • 调整 grok 模式:若 MySQL/Tomcat 日志格式与示例不同,需修改 filter 中的 grok 匹配规则(可使用 Kibana 【Dev Tools】→【Grok Debugger】调试 grok 语法);
  • 验证日志格式:cat /var/log/mysql/slow.log 查看实际日志格式,适配 grok 模式。

3. Kibana 看不到索引

  • 检查 ES 索引是否生成:访问 http://192.168.10.26:9200/_cat/indices?v,确认 mysql_slow_query-*tomcat_access-* 索引存在;
  • 检查 Logstash 输出配置:确保 elasticsearch.hosts 指向正确的 ES 集群地址;
  • 等待日志采集:若刚生成测试日志,可能需要 10~30 秒同步到 ES,耐心等待后刷新 Kibana。

七、扩展建议

  1. 日志轮转 :配置 MySQL/Tomcat 日志轮转(如 logrotate),避免日志文件过大;
  2. 索引生命周期管理(ILM):在 Kibana 中配置索引生命周期,自动删除过期日志(如保留 30 天),节省 ES 存储空间;
  3. 告警配置 :针对 MySQL 慢查询(mysql_query_time > 5)、Tomcat 500 错误(tomcat_status:500)配置 Kibana 告警,及时发现问题;
  4. 多节点采集 :若 MySQL/Tomcat 部署在多台服务器,只需在每台服务器安装 Filebeat,配置相同的 output.logstash 地址,即可统一采集。
相关推荐
叫致寒吧8 小时前
ELK简述
elk
2501_939909059 小时前
ELK 企业级日志分析系统
elk
m0_4887776510 小时前
ELK 企业级日志分析系统
elk·filebeat·企业级日志分析系统
lin张19 小时前
ELK企业级日志分析系统全方位详解
elk
nhdh1 天前
ELK(elasticsearch-7.6.2,kibana-7-6-2,Logstash-7.6.2)单节点部署
大数据·elk·elasticsearch
伞啊伞1 天前
部署安装ELK+filebeat 7.8.1版本
elk
不想画图1 天前
ELK+Filebeat实战
运维·elk
hanyi_qwe1 天前
ELK 企业级日志分析系统
elk
管理大亨1 天前
ELK的核心价值及企业级应用成功案例
elk