日志分析 Elasticsearch 和 logstach.filebeat.

发布时间:2026/5/20 22:50:54

日志分析 Elasticsearch 和 logstach.filebeat. 一、Elasticsearch 到底是啥简单说ES 就是一个能飞速搜索和分析海量数据的搜索引擎。类似百度、谷歌但它是给你公司内部的数据用的。比如淘宝搜商品输入“手机 拍照好”毫秒级给你结果——背后就是 ES。公司每天产生几 TB 的日志服务器记的流水账你想查“昨天下午3点哪台服务器报错了”——ES 能秒回。传统数据库如 MySQL做这种事很慢因为它是按行存的搜关键词得全表扫描像大海捞针。ES 用了倒排索引相当于书的目录你要找“苹果”这个词直接翻目录看到它在第几页不用从头翻全书。二、ES 牛在哪快毫秒级响应就算数据量上亿。能撑大场面数据量大了加机器就行自动分摊支持 PB 级1PB 100万GB。灵活存 JSON 文档不需要像数据库那样先设计表结构。今天存个用户信息明天加个字段不用改表。能算能分析不光能搜还能做统计比如“过去一个月每个小时卖了多少单”一句查询搞定。三、跟传统数据库有啥不一样传统数据库Elasticsearch固定表结构改字段麻烦存 JSON随你加字段查个关键词慢得要死倒排索引飞一般的速度强事务、很严谨ACID最终一致牺牲一点严谨换速度只能精确匹配或简单模糊查询支持拼音纠错、同义词、相关性排序举个例子在 MySQL 里搜“苹果”可能把“苹果公司”和“吃苹果”混一起排序也难。ES 能自动算相关性把最符合你意图的排前面。四、ES 主要干啥用电商搜索筛选、排序、推荐日志分析公司所有服务器的日志丢进 ES出问题可以快速定位配合 Kibana 画图表监控告警API 调用慢了多少毫秒哪台机器 CPU 爆了安全分析检测异常登录、暴力破解等业务报表实时统计销售额、用户活跃度等五、ES 7.0 有啥改进简化了数据模型以前一个索引里可以分多种“类型”容易乱7.0 废除了更清爽。集群协调更稳用 Raft 协议一种共识算法代替旧机制主节点挂了自动选新的不需要你手动配。性能优化搜索省内存、压缩更好、并发能力翻倍。安全加强默认开启加密权限控制更细。六、配置 ES 要注意啥只记关键点配置文件/etc/elasticsearch/elasticsearch.yml必改项cluster.name集群名同一集群所有节点必须一样。node.name节点名方便辨认。network.host绑定的 IP生产环境别用0.0.0.0不安全。discovery.seed_hosts告诉新节点“老节点在哪”用于加入集群。cluster.initial_master_nodes第一次启动时哪些节点参与选主。内存配置jvm.options堆内存-Xms和-Xmx设成一样通常为物理内存的一半但别超过 32GB否则压缩指针失效。生产环境必须bootstrap.memory_lock: true禁用 swap换页否则性能骤降。节点角色小规模一个节点啥角色都干主节点数据节点协调节点。大规模角色分离——主节点只管集群管理不存数据数据节点只管存数据协调节点只管转发请求。避免单点瓶颈。安全开启xpack.security.enabled设密码。节点间通信开 TLS 加密否则内网抓包能看到你的数据。七、常用操作命令最常用的几条bash# 看集群健康不健康green/yellow/red curl localhost:9200/_cluster/health?pretty # 看有哪些节点 curl localhost:9200/_cat/nodes?v # 新建一个索引相当于数据库的表 curl -XPUT localhost:9200/my_index -H Content-Type: application/json -d { settings: { number_of_shards: 3, number_of_replicas: 1 } } # 插入一条数据 curl -XPOST localhost:9200/my_index/_doc -H Content-Type: application/json -d { name: 张三, age: 28 } # 搜索一下 curl localhost:9200/my_index/_search?qname:张三pretty八、生产环境避坑指南千万别用 root 跑 ES安全漏洞。文件描述符开大点ulimit -n 65536否则连接多了报错。不要用网络磁盘NFS性能烂。分片数别乱设每个分片 20~40GB 为宜太多分片管理开销大。监控磁盘超过 95% 会锁死索引只能读不能写。定期备份用快照功能存到 HDFS 或 S3。九、一句话总结ES 就是一个能存海量数据、搜得快、还能做实时统计的分布式搜索引擎。配置好了它就像个听话的超级助理你问什么它秒回配砸了它能让你加班到天亮。生产环境务必角色分离、开安全、锁内存、监控磁盘。一、Logstash 是干啥的简单说Logstash 就是一个“数据管道工”。它从各种地方把数据拽过来洗一洗、改一改再送到该去的地方。比如从服务器日志文件里读数据 → 提取出时间、错误类型、IP地址 → 存到 Elasticsearch 里方便搜索和画图。从数据库里查订单 → 转成统一格式 → 发给 Kafka 消息队列。核心三步走输入input数据从哪来文件、数据库、Kafka、TCP/UDP 端口、Redis……过滤filter数据怎么洗解析、改字段、删脏数据、加标签……输出output数据往哪去Elasticsearch、文件、stdout控制台、Kafka……二、配置文件长啥样配置文件分三块像三个车间rubyinput { # 从哪里拿数据 } filter { # 怎么处理数据 } output { # 送到哪里去 }三、常用输入插件数据从哪来插件大白话解释file盯着一个日志文件有新行就立刻读进来。比如/var/log/nginx/access.logbeats接收 Filebeat、Metricbeat 等小工具发来的数据。默认端口 5044tcp/udp监听某个端口别的程序通过 TCP/UDP 发数据过来http开一个 HTTP 接口别人 POST 数据进来jdbc定期查数据库MySQL、PostgreSQL 等把表里的数据拉进来kafka从 Kafka 主题里消费数据stdin从键盘手动输入一般只用来测试四、常用过滤插件怎么处理数据插件大白话解释grok最强大的文本解析器。用正则把杂乱日志拆成有意义的字段。比如192.168.1.1 - - [10/May/2026:13:55:36 0800] GET /index.html 200→ 拆出clientip、timestamp、verb、request等字段。date把日志里的时间字符串比如10/May/2026:13:55:36 0800解析成 Logstash 内部的时间戳方便按时间排序。mutate改字段重命名、删除、类型转换字符串变整数、替换内容……json如果字段里存的是 JSON 字符串把它解析成真正的字段。dissect和 grok 类似但更快适合用分隔符比如空格、-切分不需要正则。drop根据条件扔掉某些事件比如把 debug 级别的日志全丢掉。clone复制一份事件改完后再输出原事件保留。五、常用输出插件数据送到哪插件大白话解释elasticsearch最常见的输出。把处理后的数据存到 ES 里建索引时还能按日期滚动比如nginx-log-%{YYYY.MM.dd}。stdout打印到控制台一般用来调试看数据长啥样。配合codec rubydebug能看到漂亮的字段结构。file写到本地文件。kafka发回 Kafka让下游继续处理。redis推送到 Redis 列表或频道。http通过 HTTP POST 发送到别的 API。六、条件判断让管道灵活起来Logstash 支持if、else if、else就像编程一样。常用判断rubyif [log_level] ERROR { # 只处理错误日志 } if nginx in [tags] { # 如果打上了 nginx 标签送到 nginx 索引 elasticsearch { index nginx-%{YYYY.MM.dd} } } else if apache in [tags] { elasticsearch { index apache-%{YYYY.MM.dd} } } if [response_time] 1000 { # 响应时间超过1秒的加个慢查询标签 mutate { add_tag [slow_request] } }可用的比较符等于不等于!大于小于大于等于小于等于正则匹配~不匹配!~逻辑与或||包含in不包含not in常用于[tags]字段七、一个真实的配置例子来自文档rubyinput { beats { port 5044 } # 从 Filebeat 收数据 } output { if nginx1 in [tags] { elasticsearch { hosts [192.168.166.9:9200] index nginx1-%{YYYY.MM.dd} } } if nginx2 in [tags] { elasticsearch { hosts [192.168.166.9:9200] index nginx2-%{YYYY.MM.dd} } } stdout { codec rubydebug } # 顺便打印到屏幕方便看 }解读输入监听 5044 端口等 Filebeat 发数据。判断如果数据带nginx1标签就存到 ES 的nginx1-2026.05.19索引如果是nginx2就存到对应索引。同时把每条数据打印到控制台调试用。八、小提示grok 很强大但也会吃性能。如果日志格式固定用dissect更快。生产环境建议把 stdout 关掉否则控制台刷屏影响性能。条件判断写在 output 里可以分流写到不同索引或不同系统。调试时先用 stdin 输入一行数据用 stdout 输出确认 filter 写对了再上生产。九、一句话总结Logstash 就是一根万能的“数据水管”进水管input可以接各种源头中间可以加各种“净水器”filter来清洗、转换数据最后出水管output把干净水送到 ES、文件或其他地方。配置文件就是告诉你这根管子怎么接。一、Filebeat 是啥简单说Filebeat 就是一个“轻量级日志搬运工”。它专门负责从服务器上的日志文件里读出新内容然后送到 Elasticsearch 或 Logstash 里去。比如你有 100 台服务器每台都产生日志。你不可能一台台 SSH 上去看。Filebeat 就装在这些服务器上它会盯着日志文件一有新的日志行就立刻收走、转发到中央系统。这样你就能在一个地方比如 Kibana统一查看所有日志。记住两点轻量级 —— 占资源少不会把服务器拖垮专门收日志 —— 别的不管就管日志文件二、Filebeat 怎么工作的两兄弟配合Filebeat 内部有两个好兄弟inputs和harvesters。2.1 Harvester收割机一个 harvester 负责一个文件它打开这个文件一行一行地读然后把内容发出去。只要 harvester 还在运行文件句柄就一直开着文件删了也不释放空间这点要注意。2.2 Input输入配置一个 input 管理一堆 harvesters。你告诉 input“去 /var/log/*.log 里找文件”它就会为每个匹配的文件启动一个 harvester。每个 input 是独立运行的Go 协程。举个例子yamlfilebeat.inputs: - type: log paths: - /var/log/*.log # 这里所有 .log 文件都会被监控 - /var/log/nginx/*.log2.3 怎么记住读到哪里了registry 注册表Filebeat 会把每个文件已经读到哪里偏移量记在一个叫registry的文件里。这样即使 Filebeat 重启了它也知道从上次断开的地方继续读不会重复读也不会漏读。重启后从 registry 恢复状态继续从断点读。如果每天产生海量新文件registry 可能变大。可以用clean_inactive等配置清理旧文件的状态。2.4 保证至少发一次at-least-onceFilebeat 承诺每条日志至少发送一次不会丢数据。它是怎么做到的它把发送状态也记在 registry 里。如果目标ES 或 Logstash挂了Filebeat 会不断重试直到对方确认收到。代价是可能重复发送如果在发送过程中 Filebeat 被强制关闭有些已发送但没来得及确认的日志重启后会再发一次。可以设置shutdown_timeout让它在关闭前多等一会儿减少重复。三、模块Modules懒人福音如果你不想自己写复杂的解析规则Filebeat 提供了现成的模块覆盖常见日志格式Nginx、Apache、MySQL、Kafka、Elasticsearch、Redis、System系统日志……一个模块通常包含默认日志路径自动适配不同操作系统Ingest Node 解析管道自动提取字段字段类型定义Kibana 仪表盘直接看图使用模块只需要几步bash# 1. 启用模块 filebeat modules enable nginx mysql # 2. 设置初始环境加载仪表盘、模板等 filebeat setup -e # 3. 运行 filebeat -e然后去 Kibana 就能看到漂亮的图表。如果你要改日志路径可以在modules.d/nginx.yml里配yaml- module: nginx access: var.paths: [/var/log/nginx/access.log*]四、核心配置filebeat.yml4.1 Inputs 配置手动不用模块时yamlfilebeat.inputs: - type: log # 类型是日志文件 enabled: true paths: - /var/log/*.log fields: # 自己加点字段方便区分 service: web fields_under_root: true # 让自定义字段变成顶级字段 exclude_lines: [^DBG] # 丢掉以 DBG 开头的行 include_lines: [^ERR, ^WARN] # 只保留 ERR 或 WARN 开头的行 ignore_older: 24h # 超过 24 小时没改动的文件忽略 scan_frequency: 10s # 每 10 秒扫一次目录看有没有新文件 close_inactive: 5m # 文件 5 分钟没新行就关闭文件句柄4.2 多行日志处理像 Java 堆栈很多日志一行写不完比如异常堆栈textException in thread main java.lang.NullPointerException at com.example.myproject.Book.getTitle(Book.java:16) at com.example.myproject.Bootstrap.main(Bootstrap.java:14)要把它们合并成一个事件用multiline配置yamlmultiline.pattern: ^[[:space:]] # 匹配以空格开头的行 multiline.negate: false # 不取反 multiline.match: after # 匹配到的行合并到前一行后面效果以空格开头的行堆栈行会被接到上一行后面变成一条完整日志。常用模式还有时间戳开头pattern: ^\[[0-9]{4}-[0-9]{2}-[0-9]{2}negate: truematch: after行尾反斜杠续行pattern: \\$match: before4.3 输出配置输出到 Elasticsearch最常见yamloutput.elasticsearch: hosts: [localhost:9200] index: filebeat-%{[agent.version]}-%{yyyy.MM.dd} username: elastic password: changeme输出到 Logstash如果你想在 Logstash 里做更复杂的处理yamloutput.logstash: hosts: [localhost:5044] loadbalance: true # 如果多个 Logstash可以负载均衡4.4 加载外部配置如果配置太长了可以拆成小文件yamlfilebeat.config.inputs: enabled: true path: configs/*.yml # 这个目录下的每个 yml 文件都算一个 input五、常见问题FAQ5.1 “Too many open files” 错误Filebeat 默认会一直打开正在读的文件句柄。如果同时监控成千上万个文件可能超过系统限制。解决办法调小close_inactive让不活跃的文件尽快关闭。增大系统的ulimit -n。5.2 Filebeat 不收集某个文件检查路径对不对文件修改时间是否超过了ignore_older目标输出ES/Logstash是否可访问用filebeat -e -d *调试模式看日志。5.3 CPU 占用高可能是scan_frequency太短比如 1 秒扫一次目录。默认 10 秒就够了不需要太频繁。文件实时性靠close_inactive和 harvester 持续读来保证不是靠频繁扫描。六、附录常用变量动态索引名在配置索引名时可以用变量例如%{[agent.version]}→ Filebeat 版本号%{yyyy.MM.dd}→ 当前日期2026.05.19%{[host.name]}→ 主机名%{[fields.service]}→ 自定义字段比如index: logs-%{[fields.service]}-%{yyyy.MM.dd}会生成logs-web-2026.05.19这样的索引。七、一句话总结Filebeat 就是一个装在服务器上的小机器人你告诉它“盯着哪些日志文件”它就会实时地把新内容捡起来送到 Elasticsearch 或 Logstash 里。它占用资源少、能记住读到哪里、支持多行合并、还有现成的模块帮你解析常见日志格式。配置好之后你就不用再 SSH 到每台机器上看日志了。

相关新闻