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. 报错日志 ↩︎ ↩︎
相关推荐
文青小兵19 小时前
Linux云计算——docker compose haibor elfk (四)
linux·服务器·docker·云计算
文青小兵19 小时前
Linux云计算——docker部分技术、命令 (一)
linux·docker·云计算
文青小兵20 小时前
Linux云计算——docker 监控(五)
linux·docker·云计算·grafana·prometheus
文青小兵20 小时前
Linux云计算——docker镜像(三)
linux·docker·云计算
文青小兵21 小时前
Linux云计算——docker 网络和部分挂载(二)
linux·docker·云计算
AOwhisky1 天前
Ceph系列第四期:Ceph块存储(RBD)精讲
linux·运维·笔记·ceph·云计算·rbd
代码N年归来仍是新手村成员2 天前
【AWS】Lambda 初识与服务部署
javascript·react.js·ai·node.js·云计算·ai编程·aws
小哈里2 天前
【K8S】云原生时代的GitOps最佳实践 —— ArgoCD
云原生·kubernetes·云计算·argocd·基础设施
wanhengidc2 天前
云手机 跨设备无缝衔接
运维·服务器·人工智能·智能手机·云计算
爱笑的源码基地2 天前
智慧班牌源码:从后端SpringBoot到前端Vue2的全栈实现
java·大数据·云计算·源码·程序代码·智慧校园源码·智慧班牌源码