news 2026/4/28 12:45:56

从零实现Elasticsearch与Logstash协同部署的操作步骤

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零实现Elasticsearch与Logstash协同部署的操作步骤

手把手教你搭建 Elasticsearch + Logstash 日志系统:从零开始的实战指南

你有没有遇到过这样的场景?线上服务突然报错,几十个微服务实例各自写日志,排查问题时只能一台台登录服务器greptail -f,效率极低还容易遗漏关键信息。更别提非结构化的文本日志里藏着一堆堆栈异常,想统计一下“过去一小时 500 错误的数量”都得靠脚本拼凑。

这不是个例。随着容器化和微服务普及,日志分散已成为运维头号难题。而解决这个问题的标准答案之一,就是Elastic Stack—— 尤其是其中的ElasticsearchLogstash组合。

今天,我们就抛开理论堆砌,不谈空泛概念,直接上手操作:从零开始部署 Elasticsearch,配置 Logstash 采集日志并写入 ES,最后验证数据是否真正流动起来。整个过程适用于学习、测试甚至小型生产环境,让你在两小时内拥有一套可用的日志分析流水线。


为什么是 Elasticsearch + Logstash?

先说清楚一点:现在很多人用 Filebeat 替代 Logstash 做日志采集,因为它轻量、资源占用少。但如果你需要对日志做复杂的清洗、解析、字段增强(比如把一行 Nginx 日志拆成 IP、路径、状态码、耗时等字段),Logstash 依然是不可替代的核心组件

而 Elasticsearch,则是这一切的终点站——它不只是个搜索引擎,更是为日志分析而生的数据存储与查询引擎。它的倒排索引机制让全文检索变得飞快,聚合功能又能轻松完成“按天统计访问量”这类任务。

所以,这套组合拳的意义在于:

把原本散落在各处、格式混乱的日志,变成可搜索、可分析、可追溯的结构化数据资产。

接下来,我们一步步来实现这个转变。


第一步:安装并启动 Elasticsearch

1. 环境准备

确保你的 Linux 主机满足以下条件:
- 操作系统:CentOS / Ubuntu 等主流发行版
- Java 运行时:Elasticsearch 7.x 及以上版本自带 JDK,无需额外安装
- 内存建议:至少 4GB RAM(Elasticsearch 是内存大户)
- 关闭 swap(可选但推荐):
bash sudo swapoff -a
并注释/etc/fstab中的 swap 行以永久关闭。

2. 下载与解压

前往 Elastic 官网下载页面 获取最新版本(本文以 8.11.3 为例):

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.11.3-linux-x86_64.tar.gz tar -xzf elasticsearch-8.11.3-linux-x86_64.tar.gz cd elasticsearch-8.11.3

3. 修改基础配置(单节点模式)

编辑配置文件:

vim config/elasticsearch.yml

添加或修改以下内容:

# 节点名称 node.name: node-1 # 网络绑定地址,允许外部访问 network.host: 0.0.0.0 # 设置集群名称(避免与其他集群冲突) cluster.name: my-logging-cluster # 单节点部署需禁用发现机制 discovery.type: single-node # 启用 CORS(方便后续 Kibana 或浏览器调试) http.cors.enabled: true http.cors.allow-origin: "*"

⚠️ 注意:生产环境中不应开放0.0.0.0"*"跨域,此处仅为测试方便。

4. 启动 Elasticsearch

# 切换到非 root 用户运行(安全要求) sudo useradd elastic sudo chown -R elastic:elastic /path/to/elasticsearch-8.11.3 su - elastic # 启动服务 ./bin/elasticsearch

首次启动会自动生成证书和密码(特别是 v8+ 版本)。你会看到类似输出:

Security is enabled by default Password for the elastic user: xxxxxxx

记下这个初始密码!后续连接必须使用。

5. 验证服务是否正常

新开终端执行:

curl -k -u elastic 'https://localhost:9200'

输入刚才生成的密码后,应返回 JSON 响应,包含 cluster_name、version、tagline 等信息。说明 Elasticsearch 已成功运行!


第二步:配置 Logstash 实现日志采集与处理

1. 安装 Logstash

同样去官网下载:

wget https://artifacts.elastic.co/downloads/logstash/logstash-8.11.3-linux-x86_64.tar.gz tar -xzf logstash-8.11.3-linux-x86_64.tar.gz cd logstash-8.11.3

无需复杂安装,解压即用。

2. 编写核心配置文件:logstash.conf

我们要实现的目标是:读取 Nginx 访问日志 → 解析出结构化字段 → 写入 Elasticsearch。

创建配置文件:

vim config/nginx-pipeline.conf

写入以下内容:

input { file { path => "/var/log/nginx/access.log" start_position => "beginning" sincedb_path => "/dev/null" # 测试环境忽略断点续传 codec => plain } } filter { grok { match => { "message" => "%{COMBINEDAPACHELOG}" } } date { match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ] target => "@timestamp" } mutate { remove_field => ["timestamp", "headers", "request", "pid", "tid", "ident"] } } output { elasticsearch { hosts => ["https://localhost:9200"] user => "elastic" password => "your_initial_password_here" # 替换为第一步中生成的密码 index => "nginx-access-%{+YYYY.MM.dd}" ssl_certificate_verification => false # 测试环境跳过证书验证 } stdout { codec => rubydebug } }
🔍 关键点解读:
配置项作用说明
file input监听指定日志文件,start_position => beginning表示从头读取,适合测试
%{COMBINEDAPACHELOG}Grok 内建模板,能自动匹配 Nginx 默认 access log 格式
date filter将原始日志中的时间字符串转为标准@timestamp,用于时间范围查询
mutate remove_field删除冗余字段,节省存储空间
elasticsearch output输出到 ES,按天创建索引,便于生命周期管理
stdout控制台输出处理后的事件,方便调试

💡 提示:如果你没有 Nginx 日志,可以手动创建一个模拟文件:

sudo mkdir -p /var/log/nginx echo '192.168.1.1 - - [10/Apr/2025:10:00:01 +0000] "GET /api/user HTTP/1.1" 200 1234 "-" "curl/7.68.0"' \ > /var/log/nginx/access.log

3. 启动 Logstash

./bin/logstash -f config/nginx-pipeline.conf --path.data data/logstash-data

首次启动较慢,等待出现[api-service] Successfully started Logstash API endpoint表示运行成功。

你会立刻看到控制台打印出结构化后的事件,形如:

{ "clientip": "192.168.1.1", "method": "GET", "request": "/api/user", "status": "200", "@timestamp": "2025-04-10T10:00:01.000Z" }

这说明 Logstash 已经成功解析了日志,并准备将其发送给 Elasticsearch。


第三步:验证数据是否写入 Elasticsearch

回到终端,执行查询命令:

curl -k -u elastic 'https://localhost:9200/_cat/indices?v'

你应该能看到类似输出:

health status index uuid pri rep docs.count green open nginx-access-2025.04.10 abcdefghijklmnop 1 1 1

说明索引已自动创建,且有一条文档被写入。

再查具体内容:

curl -k -u elastic 'https://localhost:9200/nginx-access-2025.04.10/_search?pretty'

返回结果中将包含你刚刚写入的那条日志记录,字段已被正确提取。

🎉 至此,一条完整的日志处理链路已经打通
文件日志 → Logstash 解析 → Elasticsearch 存储 → 可查询


常见坑点与避坑秘籍

我在实际部署中踩过不少坑,这里总结几个新手最容易栽跟头的地方:

❌ 问题1:Logstash 启动失败,提示 “Could not connect to Elasticsearch”

原因:网络不通或认证失败
解决方案
- 检查 ES 是否监听9200端口:netstat -tulnp | grep 9200
- 确保hosts => ["https://localhost:9200"]使用 HTTPS(v8+ 默认启用 TLS)
- 检查用户名密码是否正确
- 若本地防火墙开启,放行端口:sudo ufw allow 9200

❌ 问题2:Grok 解析失败,字段为空

原因:日志格式与%{COMBINEDAPACHELOG}不匹配
解决方案
- 先用stdout { codec => line }查看原始message内容
- 使用在线 Grok 调试工具(如 https://grokdebugger.com)测试正则表达式
- 自定义 pattern 如%{IP:clientip} ...

❌ 问题3:Elasticsearch 因内存不足崩溃

原因:JVM 堆设置过大或系统内存不足
解决方案
- 修改config/jvm.options,将堆大小设为物理内存的 50%,不超过 32GB
-Xms4g -Xmx4g
- 避免在同一台机器运行过多内存密集型服务


进阶思考:这套系统还能怎么升级?

你现在拥有的是一个最小可行系统(MVP)。但在真实生产环境中,还可以做这些优化:

✅ 引入 Filebeat 替代 file input

Filebeat 更轻量,专为日志文件监控设计,支持 ACK 机制防止丢数据。Logstash 专注处理逻辑,职责分离更清晰。

✅ 使用 Ingest Pipeline 替代部分 Filter

Elasticsearch 支持 Ingest Node,可以在写入前执行预处理(如 Grok、日期转换),减轻 Logstash 压力。

✅ 添加 Kafka 作为缓冲层

当流量突增时,Kafka 可充当削峰填谷的角色,避免 Logstash 处理不过来导致日志堆积。

✅ 配合 Kibana 实现可视化

导入索引模式后,在 Kibana 中创建仪表板,实时查看 PV、UV、错误率趋势图,真正发挥日志价值。


写在最后

通过这次动手实践,你不再只是“听说过 ELK”,而是亲手构建了一个能跑起来、看得见效果的日志系统。这种“从无到有”的掌控感,正是技术成长中最宝贵的体验。

记住,所有复杂的系统都是由简单的模块一步步搭起来的。今天我们完成了第一步——让日志流动起来。下一步,你可以尝试接入 Java 应用的 JSON 日志、解析 Spring Boot 的异常堆栈、或是建立告警规则检测高频错误。

技术的世界很大,但入口往往很小。只要你愿意打开终端,敲下第一行命令,就已经走在了正确的路上。

如果你在部署过程中遇到了其他问题,欢迎留言交流。我们一起把这套系统变得更健壮、更智能。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 17:08:26

快速理解USB3.0传输速度:基础性能测试通俗解释

深入理解USB 3.0真实传输速度:从协议到实战的完整解析你有没有遇到过这种情况?买了一个标着“USB 3.0”的移动硬盘,接口是蓝色的,宣传页上写着“极速传输”,结果拷贝一部4K电影花了十几分钟——比想象中慢得多。问题出…

作者头像 李华
网站建设 2026/4/25 16:22:52

《P4071 [SDOI2016] 排列计数》

题目描述求有多少种 1 到 n 的排列 a,满足序列恰好有 m 个位置 i,使得 ai​i。答案对 1097 取模。输入格式本题单测试点内有多组数据。输入的第一行是一个整数 T,代表测试数据的组数。以下 T 行,每行描述一组测试数据。对于每组测…

作者头像 李华
网站建设 2026/4/25 17:08:22

玩转Java Map集合,从基础到实战的全面解析

在Java集合框架中,Map是与Collection并列的核心接口,它以**键值对(Key-Value)**的形式存储数据,是开发中处理映射关系的必备工具。不管是日常业务开发中的数据缓存、配置存储,还是复杂的业务逻辑映射&#…

作者头像 李华
网站建设 2026/4/25 15:13:12

【C/C++】C语言内存函数

memcpy使用和模拟实现memcpy可以代替strcpy代码语言&#xff1a;javascriptAI代码解释void * memcpy ( void * destination, const void * source, size_t num );//void*来接受任意指针,size_t 单位是字节 //memcpy的头文件为<string.h> mem是memory的缩写 是内存的意思…

作者头像 李华
网站建设 2026/4/25 8:01:31

【C/C++】字符函数和字符串函数

字符函数和字符串函数1.字符分类函数C语⾔中有⼀系列的函数是专⻔做字符分类的&#xff0c;也就是⼀个字符是属于什么类型的字符的。 这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h在这里插入图片描述这些函数的使⽤⽅法⾮常类似&#xff0c;我们就讲解⼀个函数的事情&#xf…

作者头像 李华
网站建设 2026/4/25 22:03:56

【C/C++】深入理解指针(一)

1.1 内存在讲内存和地址之前&#xff0c;我们想有个⽣活中的案例&#xff1a; 假设有⼀栋宿舍楼&#xff0c;把你放在楼⾥&#xff0c;楼上有100个房间&#xff0c;但是房间没有编号&#xff0c;你的⼀个朋友来找你玩&#xff0c; 如果想找到你&#xff0c;就得挨个房⼦去找&am…

作者头像 李华