37 日志分析:ELK(Elasticsearch+Logstash+Kibana)

文章目录

前言

本文档系统梳理了 ELK 企业级日志分析系统 的核心组成、工作原理、部署流程及扩展架构(如 Filebeat + ELK)。内容涵盖 Elasticsearch、Logstash、Kibana 三大组件的功能特性、使用场景与配置细节,并提供完整的实验部署步骤,适用于日志集中化管理、实时监控、安全分析等企业级应用场景。

  1. ELK 概述与核心组件功能
  2. Elasticsearch 架构、特点与集群部署
  3. Logstash 数据采集、过滤与输出机制
  4. Kibana 可视化与交互式分析能力
  5. 完整 ELK 系统部署实验(含 Apache 日志接入)
  6. Filebeat 轻量级日志采集器集成(EFLK 架构)

理论部分

1_ELK日志分析系统概述

ELK 是一套开源的日志集中处理解决方案,由 Elasticsearch、Logstash、Kibana 三大组件构成,用于实现日志的 收集、存储、搜索、分析与可视化。适用于分布式系统中多源日志的统一管理。

1.1_核心组件角色

组件 功能 技术特点
Elasticsearch 分布式搜索引擎,负责日志存储与全文检索 基于 Lucene,RESTful API,支持高可用集群
Logstash 数据采集与处理管道 支持 input → filter → output 流程,插件丰富
Kibana 数据可视化前端 提供图表、仪表盘、告警、机器学习等高级功能

适用场景 :当企业拥有数十至上百台服务器,需集中分析系统/应用/安全日志时,传统 grep 工具效率低下,ELK 可提供高效、可扩展的日志分析平台。


2_Elasticsearch介绍

Elasticsearch 是一个基于 Lucene 的分布式、实时、可扩展的搜索引擎,使用 Java 开发,通过 RESTful API 提供全文搜索与结构化查询能力。

https://blog.csdn.net/qq_17153885/article/details/135323449

2.1_核心功能

  • 全文搜索:快速索引与检索文本数据
  • 实时分析:数据写入后立即可查
  • 分布式架构:支持横向扩展与高可用
  • RESTful API:HTTP 接口便于集成

2.2_架构与关键概念

复制代码
Cluster(集群)
 └── Node(节点):主节点 / 数据节点
      └── Index(索引) ≈ 数据库表
           ├── Shard(分片):数据分片,提升并发与容量
           └── Replica(副本):冗余备份,提高容错性
                └── Document(文档):JSON 格式最小数据单元

① 集群健康状态

状态 含义
green 所有主分片与副本均正常
yellow 主分片正常,副本缺失(单节点常见)
red 主分片丢失,数据不完整

2.3_使用场景

  • 日志与事件流分析(配合 Logstash/Kibana)
  • 电商商品搜索、社交内容检索
  • 系统监控与告警
  • 商业智能(BI)与趋势分析

2.4_优缺点

优点 :高性能、易扩展、灵活查询、开源社区活跃
缺点:内存消耗大、DSL 学习曲线陡峭、大规模集群运维复杂


3_Logstash介绍

Logstash是用Ruby编写、运行于JVM 的数据处理管道,支持从多源采集、过滤转换、实时输出到目标系统(如 ES)。充当"日志搬运工"的角色。

3.1_三大处理阶段

Logstash 配置文件由三个核心部分组成,定义了数据的 输入 → 处理 → 输出 流程:

部分 作用 常见用法
input 从数据源采集原始日志 file(日志文件) beats(Filebeat) kafkasyslog
filter(可选) 对数据清洗与增强 使用 grok(正则解析) date(时间格式化) mutate(字段修改)等插件
output 将处理后的数据发送到目标系统 elasticsearch(主输出) filekafkastdout(调试)等

数据清洗:数据处理,包括过滤和格式化、去重等

配置模板 :[③ 配置系统日志采集](#③ 配置系统日志采集)

conf 复制代码
input { ... }
filter { ... }   # 按需启用
output { ... }

示例场景

从Apache日志文件(input)提取客户端IP和状态码(filter),再写入Elasticsearch(output)。

3.2_使用场景

  • 集中收集系统/应用日志
  • 日志格式标准化(如解析 Nginx/Apache 日志)
  • 多目的地分发(ES + S3 + HDFS)

3.3_轻量级替代方案

① Filebeat

  • 轻量级日志 shipper,资源占用低
  • 常用于 EFLK 架构(Filebeat → Logstash → ES → Kibana)
  • 优势:支持 ACK 机制、背压感知、本地缓冲

ACK机制:发送日志后需接收方确认,确保不丢失。

背压感知:下游处理慢时自动减速,防止崩溃。

本地缓冲:日志位置和未发数据暂存本地,保障可靠传输。

② Fluentd

  • 更轻量、高效,常用于 EFK 架构
  • 在 Kubernetes 中通过 DaemonSet 部署,采集容器日志。

!question\] 为何引入消息队列? 在高并发场景下,使用 **Redis/Kafka/RabbitMQ** 作为缓冲层,可削峰填谷、解耦 Logstash 与数据源,防止日志丢失。


4_Kibana介绍

Kibana 是 Elasticsearch 的官方可视化工具,提供 Web 界面用于 探索、分析、展示 存储在 ES 中的数据。

4.1_核心功能

  1. Visualizations:数据可视化,折线图、饼图、地图等。
  2. Dashboards:仪表板,多图表聚合展示
  3. Log Management:日志管理
  4. Discover:原始日志搜索(支持 KQL / Lucene 语法)
  5. TSVB:时间序列分析(Time Series Analytics)
  6. Alerting:阈值告警
  7. Monitoring:监控
  8. Security:RBAC 权限控制,安全和访问控制(Security & Access Control)
  9. Machine Learning:机器学习,异常检测。(新技术:Ai智能运维、Aiops)
  10. Canvas & Reporting:自定义报告导出(PDF/CSV)
  11. Maps & Geospatial Visualization:地图和地理可视化

4.2_使用场景

  • 运维日志排查
  • 实时业务监控(如用户行为、交易流水)
  • 安全威胁检测(结合 Elastic Security)
  • 自动化异常预警

4.3_工作原理

发送 存储 查询 渲染 Logstash/Filebeat Elasticsearch Indices Kibana Dashboard/Charts

Kibana 不存储数据,仅作为 ES 的前端查询与展示层。

5_为何使用ELK进行数据可视化?

  • 日志分散难查 :传统grep在多服务器环境下效率极低。
  • 集中分析需求:ELK将日志统一收集、索引,支持快速全文检索与聚合统计。
  • 直观洞察问题:Kibana 提供图表、仪表盘,将原始日志转化为趋势、异常、流量等可视化信息。
  • 实时监控告警:可基于可视化数据设置阈值告警,及时响应故障或安全事件。
  • 降低使用门槛:非技术人员也能通过图形界面探索数据,无需写复杂命令。

简言之:从"看日志"升级为"看懂日志"

以下是针对 第6、7部分 的简明整理,格式与全文风格一致:


6_完整日志系统基本特征

一个企业级的完整日志系统应具备以下五大核心能力:

特征 说明
收集(Collect) 支持从多源(服务器、应用、网络设备等)采集日志
传输(Transport) 稳定、可靠地将日志解析、过滤并传至存储系统(支持缓冲/队列防丢失)
存储(Store) 高效存储海量日志,支持快速检索与长期归档
分析(Analyze) 提供 UI 或查询语言,支持搜索、聚合、统计与关联分析
告警(Alert) 可配置规则,对异常或关键事件自动触发通知(邮件、Webhook 等)

ELK 正是围绕这五个特征构建的一站式解决方案。


7_ELK 的工作原理⭐

ELK 的数据流转遵循 采集 → 处理 → 存储 → 展示 的四步流程:
数据分析与展示层 数据存储层 微服务日志 日志收集层 access.log
error.log tomcat.log tomcat.log 可视化图表
仪表盘 Kibanan Client ES01
存储数据 ES02
存储数据 淘宝日志 Logstash
数据过滤
格式化 Nginx Tomcat Mysql

核心步骤说明

  1. 采集 :在各服务器部署 Logstash 或更轻量的 Filebeat,实时读取日志文件。
  2. 处理:Logstash 对原始日志进行解析(如提取 IP、状态码)、格式化、添加字段等。
  3. 存储 :处理后的结构化数据发送到 Elasticsearch 集群,按索引(index)存储并建立全文索引。
  4. 展示Kibana 连接 Elasticsearch,用户通过 Web 界面创建可视化图表、仪表盘,实现交互式分析。

关键优势:端到端自动化、近实时(秒级延迟)、支持 PB 级日志规模、开放可扩展。


实验部分

运行环境

1_ELK系统部署

节点 IP 地址 角色 配置
node1 192.168.100.1 Elasticsearch + Kibana 2核/4G
node2 192.168.100.2 Elasticsearch 2核/4G
node3 192.168.100.3 Logstash + mysql和tomcat -

1.1_环境准备

所有节点

shell 复制代码
systemctl stop firewalld
setenforce 0

yum -y install perl-Digest-SHA-5.85-4.el7.x86_64

关闭防火墙与 SELinux,避免网络和权限问题。

shell 复制代码
# 设置主机名(示例:node2)
hostnamectl set-hostname apache
shell 复制代码
# 配置hosts解析
echo "192.168.100.1 node1" >> /etc/hosts
echo "192.168.100.2 node2" >> /etc/hosts
shell 复制代码
yum -y install java-1.8.0-openjdk
java -version

确保 Java 环境(OpenJDK 1.8+)


1.2_Elasticsearch集群部署

node1 & node2

  • 首先创建并切换到运行Elacticsearch的用户
shell 复制代码
useradd -mU elasticsearch
su - elasticsearch

① 安装Elasticsearch

  • 下载tar包
shell 复制代码
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.8.1-linux-x86_64.tar.gz
  • 校验下载文件完整性
shell 复制代码
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.8.1-linux-x86_64.tar.gz.sha512

shasum -a 512 -c elasticsearch-7.8.1-linux-x86_64.tar.gz.sha512
  • 解压安装包,进入项目目录。
shell 复制代码
tar -xzvf elasticsearch-7.8.1-linux-x86_64.tar.gz
cd elasticsearch-7.8.1
  • rpm包安装(备选)
shell 复制代码
rpm -ivh elasticsearch-7.8.1.rpm
systemctl daemon-reload
systemctl enable elasticsearch.service

② 配置 elasticsearch.yml

  • 修改elasticsearch主配置文件
shell 复制代码
cp config/elasticsearch.yml config/elasticsearch.yml_bak

vim config/elasticsearch.yml
yaml 复制代码
# 以下内容行取消注释
cluster.name: my-elk-cluster	# 17行,集群名字。
node.name: node1	# 23行,节点名字,node2上改为node2。
node.master: true	# 添加 设置该节点为主节点候选人
node.data: true		# 添加 设置该节点可以存储数据
path.data: /data/elk_data	# 35行,数据库存放路径
path.logs: /var/log/elasticsearch/	# 39行,日志存放路径。
bootstrap.memory_lock: false	# 45行,启动时不锁定内存。
network.host: 0.0.0.0	# 57行,监听地址为所有地址。
http.port: 9200		# 61行,默认监听端口为9200。
# discovery.zen.ping.unicast.hosts: ["node1", "node2"]	# 68行,6.8.1 集群通过单播实现,指定要发现的节点 node1、node2。
discovery.seed_hosts: ["192.168.100.1:9300", "192.168.100.2:9300"]	# 70行,7.8.1,发现节点。
cluster.initial_master_nodes: ["node1", "node2"]	#74行,7.8.1,候选主节点。
shell 复制代码
grep -v "^#" config/elasticsearch.yml

③ 创建数据目录并授权

  • 数据源目录
shell 复制代码
exit	# 退回root用户
mkdir -p /data/elk_data
chown -R elasticsearch:elasticsearch /data/elk_data/
  • 日志目录
shell 复制代码
mkdir /var/log/elasticsearch
chown -R elasticsearch:elasticsearch /var/log/elasticsearch

④ 启动并验证 [1](#1)

shell 复制代码
su - elasticsearch
cd elasticsearch-7.8.1/

# 交互运行测试看有没有报错
bin/elasticsearch
# 测试没什么问题可以放后台运行
nohup bin/elasticsearch -d -p pid.txt &

ss -antulp | grep 9200

访问 http://192.168.100.1:9200/_cluster/health?pretty 应返回 "status":"green"


1.3_安装Elasticsearch-head

Elasticsearch-head用于查看ES的效果,企业里一般不装,都用API查看:

shell 复制代码
# 黑屏操作下 查看ES索引情况(更多的可以另外找)

# 查看节点信息
curl -X GET "http://localhost:9200/_cat/nodes?v"

# 列出当前索引
curl -X GET "http://localhost:9200/_cat/indices?h=index"

# 删除一条索引
curl -X DELETE "http://localhost:9200/索引名称"
# {"acknowledged":true} 表示成功

# 查看看索引是否存在
curl -X HEAD "http://localhost:9200/索引名称"

# (查看指定索引内容 比如教案中插入了index_mode1,那么你就将该命令中的my_index换成index_mode1)
curl -X GET "http://localhost:9200/my_index?pretty"

# 基础格式(默认 ES 运行在本地 9200 端口)
curl -X GET "http://localhost:9200/_cat/indices?v"

可选,node1或2

① 安装Node.js

node.js安装包:

https://nodejs.org/en/download

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

② 安装PhantomJS

shell 复制代码
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/

③ 安装head插件

shell 复制代码
tar -zxvf elasticsearch-head.tar.gz -C /usr/local/src/
cd /usr/local/src/elasticsearch-head/
npm install

④ 修改ES配置支持跨域

yaml 复制代码
# /etc/elasticsearc/elasticsearch.yml 末尾追加
http.cors.enabled: true
http.cors.allow-origin: "*"
shell 复制代码
systemctl restart elasticsearch

⑤ 启动head服务

shell 复制代码
cd /usr/local/src/elasticsearch-head/
npm run start &

⑥ 通过 Elasticsearch-head查看Elasticsearch信息

监听端口9100 ,访问 http://192.168.100.1:9100 可图形化管理集群。

  • 连接ES集群

连接按钮前输入http://192.168.100.1:9200/→点击连接

RESTful API的基本格式
GET /index/doc_type/id 用于创建新的文档
POST /index/doc_type/ 用于获取指定ID的文档
PUT /index/doc_type/id 用于更新指定ID的文档
DELETE /index/doc_type/id 用于删除指定ID的文档
GET /index/doc_type/_search?q=field:value 用于搜索包含特定字段和值的文档

⑦ 插入索引

  • 往Elasticsearch插入一条测试数据
    新版本(7.x ~ 8.x)
shell 复制代码
curl -X PUT 'localhost:9200/index-demo1/_doc/1?pretty' \
-H 'Content-Type: application/json' \
-d '{"user":"zhangsan","mesg":"hello world"}'
部分 含义
curl 命令行发 HTTP 请求
-X PUT 创建或更新一条数据
localhost:9200 Elasticsearch 地址
index-demo1 索引名(相当于数据库表)
_doc 类型(新版本不再支持自定义type)
1 文档 ID(这条数据的唯一编号)
?pretty 让返回结果好看点(格式化输出)
-H 'Content-Type...' 声明发送的是 JSON 数据
-d '{...}' 要存的数据内容
RESTful API 格式 用途
PUT /index/_doc/id 用于创建或全量替换 指定 ID 的文档(推荐用_doc
POST /index/_doc/ 用于创建新文档,系统自动生成ID
GET /index/_doc/id 用于获取指定ID的文档内容
DELETE /index/_doc/id 用于删除指定ID的文档
GET /index/_doc/_search?q=field:value 用于搜索包含特定字段和值的文档
  • 插完后可以在elasticsearch-head里查看,确认连接和数据是否正常。

1.4_Logstash 部署

node3(apache)

Logstash一般部署在需要监控其日志的服务器。本案例部署在Apache服务器,用于收集Apache日志信息并发送到Elasticsearch。

  • 首先创建并切换到运行logstash的用户
shell 复制代码
useradd -mU logstash
su - logstash
① 安装Logstash
  • 下载tar包
shell 复制代码
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.8.1.tar.gz
  • 校验下载文件完整性
shell 复制代码
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.8.1.tar.gz.sha512

shasum -a 512 -c logstash-7.8.1.tar.gz.sha512
  • 解压安装包,进入项目目录。
shell 复制代码
tar -xzvf logstash-7.8.1.tar.gz
cd logstash-7.8.1
  • 设置文件寻找路径
shell 复制代码
cp config/pipelines.yml config/pipelines.yml_bak
vim config/pipelines.yml
yml 复制代码
- pipeline.id: main		#9行,启用一个叫main的管道。
  path.config: "config/conf.d/*.conf"	#15行,从 config/conf.d/ 目录下加载所有 .conf 文件。
  • 设置所有IP都可以监听
shell 复制代码
cp config/logstash.yml config/logstash.yml_bak
vim config/logstash.yml
yml 复制代码
http.host: 0.0.0.0		# 118行
  • rpm包安装(备选)
shell 复制代码
rpm -ivh logstash-7.8.1.rpm
ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
systemctl enable logstash
② 测试Logstash
  • 输入采用标准输入,输出采用标准输出(类似管道)
shell 复制代码
bin/logstash -e 'input { stdin{} } output { stdout{} }'
  • 使用rubydebug输出详细格式显示,codec为一种编解码器。
shell 复制代码
bin/logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'

输入任意文本或域名,应输出带时间戳、host、message 的 JSON。

  • 使用Logstash将信息写入Elasticsearch中。
shell 复制代码
bin/logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.100.1:9200"] } }'

结果不在标准输出显示,而是发送至Elasticsearch中,可浏览器访问http://192.168.100.1:9100/查看索引信息和数据浏览(需要安装head)。

③ 配置系统日志采集

3.1_三大处理阶段

  • 编辑配置文件
shell 复制代码
mkdir config/conf.d
vim config/conf.d/system.conf
conf 复制代码
input {
  file {
    path => "/var/log/messages"
    type => "system"
    start_position => "beginning"
  }
}
output {
  elasticsearch {
    hosts => ["192.168.100.1:9200"]
    index => "system-%{+YYYY.MM.dd}"
  }
}

path:指定要收集的日志的位置
type:自定义日志类型标识
start_position":从什么位置收集
"beginning":开始位置
elasticsearch {:输出到ES
hosts => ...:指定ES服务器的地址和端口
index => ...:指定输出到ES的索引格式

  • 给采集的信息源赋权
shell 复制代码
chmod +r /var/log/messages

④ 启动并验证 [1](#1)

shell 复制代码
su - logstash
cd logstash-7.8.1/

# 交互运行测试看有没有报错
bin/logstash -f config/conf.d/
# 测试没什么问题可以放后台运行
nohup bin/logstash -f config/conf.d/ &

# 查看启动日志
tail -f logs/logstash-plain.log

ss -antulp | grep 9600

1.5_Kibana 部署

官方网站 :

https://www.elastic.co/cn/downloads/kibana/
node1

  • 首先创建并切换到运行logstash的用户
shell 复制代码
useradd -mU kibana
su - kibana
① 安装与配置
  • 下载tar包
shell 复制代码
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.8.1-linux-x86_64.tar.gz
  • 校验下载文件完整性
shell 复制代码
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.8.1-linux-x86_64.tar.gz.sha512

shasum -a 512 -c kibana-7.8.1-linux-x86_64.tar.gz.sha512 
  • 解压安装包,进入项目目录。
shell 复制代码
tar -xzvf kibana-7.8.1-linux-x86_64.tar.gz
cd kibana-7.8.1-linux-x86_64
  • rpm包安装(备选)
shell 复制代码
rpm -ivh kibana-7.8.1-x86_64.rpm
  • 设置Kibana主配置文件
shell 复制代码
cp config/kibana.yml config/kibana.yml_bak
vim config/kibana.yml
yaml 复制代码
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://192.168.100.1:9200"]
kibana.index: ".kibana"

server.port: :2行,监听端口。
server.host: :7行,监听地址。
elasticsearch.hosts: :28行,和ES建立连接的地址和端口
kibana.index: :37行,在ES中添加.kibana索引

② 启动服务
shell 复制代码
su - kibana
cd kibana-7.8.1-linux-x86_64/

# 测试运行
bin/kibana
# 测试没问题放后台执行
nohup bin/kibana &

ss -antulp | grep 5601
③ 验证与创建索引模式
  • 浏览器访问 http://192.168.100.1:5601
  • (Stack) Management → Index Pattern → Create index pattern
  • Index pattern:system-*→Next step
  • Time Filter field name:@timestamp→Create index pattern
  • 进入Discover查看日志
④添加Apache日志

node3(logstash)

  • 将Apache的访问日志、错误日志,添加到Elasticsearch,并通过Kibana显示。
shell 复制代码
vim config/conf.d/apache_log.conf
conf 复制代码
input {
  file {
	path => "/var/log/httpd/access_log"
	type => "access"
	start_position => "beginning"
  }
  file {
    path => "/var/log/httpd/error_log"
    type => "error"
    start_position => "beginning"
  }
}
output {
  if [type] == "access" {
    elasticsearch {
      hosts => ["192.168.100.1:9200"]
      index => "apache_access-%{+YYYY.MM.dd}"
    }
  }
  if [type] == "error" {
    elasticsearch {
      hosts => ["192.168.100.1:9200"]
      index => "apache_error-%{+YYYY.MM.dd}"
    }
  }
}
  • 启动并加载logstash配置文件
shell 复制代码
su - logstash
cd logstash-7.8.1/
killall java
nohup bin/logstash -f config/conf.d/ &
ss -antulp | grep 9600

在Kibana中分别创建apache_access-*apache_error-*索引模式。

  • 浏览器访问http://192.168.100.1:5601
  • (Stack) Management→Index Pattern
  • Create index pattern→Index pattern:apache_access-*apache_error-*→Next step
  • Time Filter field name:@timestamp→Create index pattern
  • Discover→Add a filter:apache_error-*apache_access-*→可以查看相应的图表及日志信息
④添加mysql日志

node3(logstash)

  • 安装完mysql后在/etc/my.cnf配置文件增加以下内容
cnf 复制代码
[mysqld]
# 启用日志,影响性能,生产环境不推荐,建议使用慢查询日志。
general_log = 1
general_log_file = /var/log/mysql.log

# 慢查询日志,只记录运行超时的SQL语句
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
log_queries_not_using_indexes = 0

# 错误日志
log_error = /var/log/mysql/error.log
  • 给mysql写入日志的权限
shell 复制代码
mkdir -p /var/log/mysql
chown mysql:mysql /var/log/mysql
  • 重启mysql服务单元
shell 复制代码
systemctl restart mysqld.service
  • 将mysql的操作日志、慢查询日志、错误日志,添加到Elasticsearch,并通过Kibana显示。
shell 复制代码
vim config/conf.d/mysql_log.conf
conf 复制代码
input {
  file {
	path => "/var/log/mysql.log"
	type => "mysql"
	start_position => "beginning"
  }
  file {
    path => "/var/log/mysql/mysql-slow.log"
    type => "slow"
    start_position => "beginning"
  }
  file {
    path => "/var/log/mysql/error.log"
    type => "error"
    start_position => "beginning"
  }
}
output {
  if [type] == "mysql" {
    elasticsearch {
      hosts => ["192.168.100.1:9200"]
      index => "mysql-%{+YYYY.MM.dd}"
    }
  }
  if [type] == "slow" {
    elasticsearch {
      hosts => ["192.168.100.1:9200"]
      index => "mysql-slow-%{+YYYY.MM.dd}"
    }
  }
  if [type] == "error" {
    elasticsearch {
      hosts => ["192.168.100.1:9200"]
      index => "mysql-error-%{+YYYY.MM.dd}"
    }
  }
}
  • 给日志增加其他人的读权限
shell 复制代码
chmod -R +r /var/log/mysql
  • 增加/var/log/mysql.log日志,mysql使用增删改查即可。

  • 增加/var/log/mysql/error.log日志,输错一次密码即可。

  • 增加/var/log/mysql/mysql-slow.log日志:

shell 复制代码
mysql -uroot -p -e "SELECT SLEEP(2);"
shell 复制代码
su - kibana
cd kibana-7.8.1-linux-x86_64/
killall java
nohup bin/kibana &
ss -antulp | grep 5601
  • 在Kibana添加索引,方法已经介绍过。
⑤添加tomcat日志
文件名 用途 是否按天切 是否建议采集
catalina.out 所有输出汇总(启动、异常、GC) ❌ 否 ✅ 是(配合日志轮转)
catalina.*.log Tomcat 内部运行日志 ✅ 是 ✅ 是
localhost.*.log Web 应用输出(如 System.out) ✅ 是 ✅ 是
manager.*.log /manager 操作日志 ✅ 是 🔍 按需
host-manager.*.log 虚拟主机管理日志 ✅ 是 🔍 按需
localhost_access_log.*.txt 访问日志(类似 Nginx access) ✅ 是 ✅ 必采
📌 一句话记清
看错误 → catalina.out;做分析 → 采集所有带日期的 .logaccess_log

node3(logstash)

  • 安装和启动tomcat后给logs日志添加读权限。
shell 复制代码
chmod +x /usr/local/tomcat/
chmod +x /usr/local/tomcat/logs
chmod -R +r /usr/local/tomcat/logs/
  • 将tomcat的catalina.outcatalina.*.loglocalhost.*.loglocalhost_access_log.*.txt,添加到Elasticsearch,并通过Kibana显示。
shell 复制代码
su - logstash
cd logstash-7.8.1/
vim config/conf.d/tomcat_log.conf
conf 复制代码
input {
  file {
    path => "/usr/local/tomcat/logs/catalina.out"
    type => "catalina-out"
    start_position => "beginning"
  }
  file {
    path => "/usr/local/tomcat/logs/catalina.*.log"
    type => "catalina-log"
    start_position => "beginning"
  }
  file {
    path => "/usr/local/tomcat/logs/localhost.*.log"
    type => "localhost-log"
    start_position => "beginning"
  }
  file {
    path => "/usr/local/tomcat/logs/localhost_access_log.*.txt"
    type => "access-log"
    start_position => "beginning"
  }
}

output {
  if [type] == "catalina-out" {
    elasticsearch {
      hosts => ["192.168.100.1:9200"]
      index => "tomcat-catalina-out-%{+YYYY.MM.dd}"
    }
  }
  if [type] == "catalina-log" {
    elasticsearch {
      hosts => ["192.168.100.1:9200"]
      index => "tomcat-catalina-log-%{+YYYY.MM.dd}"
    }
  }
  if [type] == "localhost-log" {
    elasticsearch {
      hosts => ["192.168.100.1:9200"]
      index => "tomcat-localhost-log-%{+YYYY.MM.dd}"
    }
  }
  if [type] == "access-log" {
    elasticsearch {
      hosts => ["192.168.100.1:9200"]
      index => "tomcat-access-log-%{+YYYY.MM.dd}"
    }
  }
}
  • 启动并加载logstash配置文件
shell 复制代码
su - logstash
cd logstash-7.8.1/
killall java
nohup bin/logstash -f config/conf.d/ &
ss -antulp | grep 9600
  • 在Kibana添加索引,方法已经介绍过。

2_Filebeat+ELK部署

节点 IP 地址 角色 配置
node1 192.168.100.1 Elasticsearch + Kibana 2核/4G
node2 192.168.100.2 Elasticsearch 2核/4G
node3 192.168.100.3 Logstash -
node4 192.168.100.4 Filebeat + mysql和tomcat -

官方网站(中文下载):

https://www.elastic.co/cn/downloads/beats/filebeat

  • 还原所有节点,重新安装Elasticsearch、Kibana、Logstash
    node4(filebeat)

① 安装Filebeat

  • 首先创建并切换到运行filebeat的用户
shell 复制代码
useradd -mU filebeat
su - filebeat
  • 下载tar.gz包
shell 复制代码
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.8.1-linux-x86_64.tar.gz
  • 校验下载文件完整性
shell 复制代码
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.8.1-linux-x86_64.tar.gz.sha512

shasum -a 512 -c filebeat-7.8.1-linux-x86_64.tar.gz.sha512
  • 解压并进入项目目录
shell 复制代码
tar -zxvf filebeat-7.8.1-linux-x86_64.tar.gz
cd filebeat-7.8.1-linux-x86_64
  • 或使用rpm包安装
shell 复制代码
rpm -ivh filebeat-6.6.1-x86_64.rpm

② 配置filebeat

  • 修改filebeat.yml配置文件
shell 复制代码
cp filebeat.yml filebeat.yml_bak
vim filebeat.yml
yaml 复制代码
filebeat.prospectors:
- type: log
  enabled: true
  paths:
    - /var/log/messages
    - /var/log/*.log
  fields:
    service_name: filebeat
    log_type: log
    service_id: 192.168.100.4
#--------------Elasticsearch output------------------
#(ES方式这里不用,全部注释掉)

#----------------Logstash output---------------------
output.logstash:
  hosts: ["192.168.100.3:5044"]

filebeat.prospectors::收集数据
- type: log:指定log类型,从日志文件中读取消息。
- /var/log/messages:指定监控的日志文件
fields::可以设置一些参数字段添加到output中
hosts: :指定logstash的IP和端口

  • 启动并加载filebeat配置文件
shell 复制代码
if $(which filebeat);then
filebeat -e -c filebeat.yml
else
/usr/local/filebeat/filebeat -e -c filebeat.yml
fi

③ Logstash配置接收Beats
node(logstash)

  • 修改logstash配置文件
shell 复制代码
vim /etc/logstash/conf.d/filebeat.conf
conf 复制代码
input {
  beats { port => 5044 }
}
output {
  elasticsearch {
    hosts => ["192.168.100.1:9200"]
    index => "%{[fields][service_name]}-%{+YYYY.MM.dd}"
  }
  stdout { codec => rubydebug }
}
  • 启动并加载logstash配置文件
shell 复制代码
logstash -f /etc/logstash/conf.d/filebeat.conf

④ Kibana创建索引

  • Index Pattern: filebeat-*
  • Time field: @timestamp
  • Discover 中查看日志

测试filebeat、logstash配置文件问题,和测试filebeat和logstash联通性,如果都没问题基本能成功

shell 复制代码
# 测试配置合法性
/usr/local/filebeat/filebeat test config -c /usr/local/filebeat/filebeat.yml
/usr/local/filebeat/filebeat test output -c /usr/local/filebeat/filebeat.yml

# 测试文件配置是否正常
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/mysql_tomcat.conf --config.test_and_exit

结语

ELK 核心价值 :解决分布式系统日志分散、检索困难、分析低效的问题,实现 集中化、实时化、可视化 的日志管理。

关键端口与路径

  • Elasticsearch: 9200(HTTP),配置 /etc/elasticsearch/elasticsearch.yml
  • Logstash: 5044(Beats input),配置 /etc/logstash/conf.d/*.conf
  • Kibana: 5601,配置 /etc/kibana/kibana.yml
  • Filebeat: 配置 /etc/filebeat/filebeat.yml

!question\] 请问 ELK 中 Logstash 和 Filebeat 的定位有何不同? Logstash功能强大但资源消耗高,适合复杂过滤与多源整合;Filebeat轻量高效,专注日志采集与可靠传输; 通常两者配合使用(Filebeat → Logstash → ES)。 \[!question\] 为什么 Elasticsearch 集群健康状态为 yellow 仍可正常使用? yellow 表示主分片完整但副本缺失(如单节点集群),不影响读写,但缺乏高可用性。生产环境建议至少 3 节点以实现 green 状态。 \[!question\] Kibana 如何实现日志的时间范围筛选? 依赖日志中的 `@timestamp` 字段(由 Logstash/Filebeat 自动添加),在 Discover 或 Dashboard 中通过时间选择器动态过滤。


ini 复制代码
ERROR: [1] bootstrap checks failed
[1]: max number of threads [3870] for user [elasticsearch] is too low, increase to at least [4096]
ERROR: Elasticsearch did not exit normally - check the logs at /usr/local/elasticsearch/logs/my-elk-cluster.log

原因:

Elasticsearch 启动时报错 max number of threads [3870] for user [elasticsearch] is too low, increase to at least [4096],是由于系统对 elasticsearch 用户的进程/线程数限制低于要求值。

解决方法:

  • 第一步:编辑 /etc/security/limits.conf,添加
conf 复制代码
elasticsearch soft nofile 65535
elasticsearch hard nofile 65535
elasticsearch soft nproc  4096
elasticsearch hard nproc  4096
  • 增加内存映射区域
shell 复制代码
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf

sysctl -p
  • 第二步:通过 su - elasticsearch 以登录 shell 切换用户。
  • 第三步:执行 ulimit -u 验证输出为 4096,执行ulimit -n验证输出为65535。
  • 第四步:在此会话中启动 Elasticsearch,即可通过检查。
bash 复制代码
ulimit -u 4096
bash: ulimit: max user processes: 无法修改 limit 值: 不允许的操作

原因:

手动运行 ulimit -u 4096 失败并提示"无法修改 limit 值",是因为当前 shell 无权提升硬限制,且未从 PAM 加载配置。

解决方法:

  • 第一步:确保 /etc/pam.d/common-session 包含
text 复制代码
session required pam_limits.so

如果不包含:

shell 复制代码
echo "session required pam_limits.so" | tee -a /etc/pam.d/common-session
  • 第二步:必须通过登录 shell(如 su - elasticsearch)切换用户,才能加载 limits.conf 设置
  • 第三步:在该会话中无需手动设置ulimit,系统已自动应用配置

  1. 报错日志 ↩︎ ↩︎
相关推荐
珠海西格电力科技8 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
Sheffield13 小时前
command和shell模块到底区别在哪?
linux·云计算·ansible
DolitD18 小时前
云流技术深度剖析:国内云渲染主流技术与开源和海外厂商技术实测对比
功能测试·云原生·开源·云计算·实时云渲染
翼龙云_cloud18 小时前
阿里云渠道商:阿里云 ECS 从安全组到云防火墙的实战防护指南
安全·阿里云·云计算
YongCheng_Liang18 小时前
从零开始学虚拟化:桌面虚拟化(VDI)入门指南(架构 + 产品 + 部署)
运维·云计算
万物得其道者成19 小时前
阿里云 H5 一键登录接入实战:前后端完整实现
阿里云·云计算·状态模式
翼龙云_cloud1 天前
国际云代理商:2026年国际云注册风控升级实战指南 8 大平台无卡解决方案对比
服务器·阿里云·云计算
阿里云大数据AI技术2 天前
全模态、多引擎、一体化,阿里云DLF3.0构建Data+AI驱动的智能湖仓平台
人工智能·阿里云·云计算
摇滚侠2 天前
阿里云安装的 Redis 在什么位置,如何找到 Redis 的安装位置
redis·阿里云·云计算