尧图精选

分布式日志系统实战:从ELK到Kafka的搭建与排坑指南

🕒 发布时间:2026/9/10 18:48:11 📁 来源:尧图网络
1. 一次故障排查让我决定把日志系统翻个底朝天先说个真实经历。当时我们一个核心交易服务上了三个实例前端页面突然报系统繁忙我登录服务器看日志先得在十来个日志文件里翻找——业务日志、错误日志、接口访问日志混着来而且分布在不同的机器上。我首先定位到一台机器的错误日志结果发现异常只出现在其中一台另外两台完全正常但页面报错是全局的。后来折腾了一个多小时才搞明白某个接口在凌晨的定时任务里把数据库连接池打满了异常会在三台机器间随机触发可我只有一台一台地进服务器、一条一条地grep效率低到让人崩溃。那次之后我就下决心必须要有一套分布式日志系统。其实分布式日志系统这个概念很宽泛。对于小团队来说最简单的形态可能就是日志集中收集到一个地方统一检索。但如果你真正在微服务架构下跑过就会发现这事远远不止收集这么简单——它涉及日志的采集、传输、缓冲、解析、存储、检索、告警链路非常长每个环节都有坑。这篇文章我把从零搭建到稳定运行的全过程写出来包括技术选型时的几次纠结、实际部署中的具体配置、以及后续踩过的各种坑希望能帮准备上手的人省点时间。文章主要面向后端开发、运维和架构师尤其是那些服务已经拆成多个模块、日志已经开始满天飞的团队。如果你现在还能通过tail -f定位问题可能暂时不需要但只要你经历一次日志散落在十几台机器上宕机了只能一台一台上去查的夜晚你会回来把它看完的。2. 选型阶段ELK、EFK、Loki到底选哪套选型是整个项目里最容易被低估的一步。很多人一上来就想着 上ELK但ELK只是Elastic技术栈Elasticsearch、Logstash、Kibana的缩写实际生产环境很少只用这套就够。我把自己对比过的方案列一下方便你根据自己团队的情况做判断。2.1 三套主流方案的优劣势对比方案核心组件优势劣势适合场景ELKFilebeat Logstash Elasticsearch Kibana生态成熟、检索能力强、Kibana可视化丰富Logstash消耗资源较高、全链路较重量级中大型团队日志量大检索需求复杂EFKFluentd/Fluent Bit Elasticsearch KibanaFluentd轻量、插件丰富、内存占用低配置语法学习成本高、部分插件维护一般容器环境、K8s集群日志收集Loki Promtail GrafanaPromtail Loki Grafana基于标签索引、存储成本极低、和Prometheus联动好全文检索能力弱、日志量大时查询慢以监控告警为主、对日志检索深度要求不高的场景我当时纠结的是ELK和Loki。我们团队业务里有很多需要按关键字定位问题、按时间范围聚合统计、甚至结合业务字段比如订单号、用户ID去查日志的场景。Loki的索引机制是基于标签的它不索引日志内容本身查询是先按标签过滤再暴力扫描对于根据订单号搜索完整请求链路这种需求性能会跟不上。虽然Loki在成本上极其诱人存储占用大概是Elasticsearch的十分之一但我还是选择了ELK生态。2.2 为什么我最终选择了ELK Kafka的架构选ELK还有个重要原因是团队梯队问题。Elasticsearch、Kibana、Logstash的用户基数大社区资料多新人上手成本低Fluentd虽然好但遇到问题能搜到的中文资料、踩坑记录明显少一些。考虑到后面不止我一个人要维护这套系统选更主流的技术栈长期看是更稳的决策。但我也没完全照搬三件套而是加了Kafka作为消息缓冲层。原因很简单日志是写密集型场景业务高峰期每秒钟产生的日志量可以轻松超过上千条。如果让Filebeat直接往Elasticsearch里灌Elasticsearch的写入压力会非常大还可能出现写入拒绝的报错日志就丢了。加一个Kafka之后采集端和存储端之间就有了一个缓冲期即使Elasticsearch短暂抖动日志也能先在Kafka里排队不会马上丢。再加上Kafka的分区机制天然支持多消费者并行消费后面无论是接Logstash做清洗还是接实时告警计算都可以从Kafka里拉数据一套日志流可以同时喂给多条下游管道非常灵活。2.3 各组件在链路中的定位先说清楚每个组件干啥后面讲配置时你才能理解每个参数存在的意义Filebeat轻量级采集器部署在业务机器上负责读日志文件、把日志发给Kafka。它比Logstash轻得多Go写的内存占用通常在几十MB级别适合作为监控采集Agent大批量部署。Kafka消息缓冲与分发枢纽。承接Filebeat上报的日志流下游多个消费者各取所需。它的存在让日志系统在高并发下不丢数据、不阻塞。Logstash日志解析与清洗中心。从Kafka消费日志把非结构化的文本解析成结构化JSON按需要做字段拆分、类型转换、过滤丢弃然后写入Elasticsearch。Elasticsearch分布式存储与检索引擎。所有日志最终落在这里支撑全文检索、聚合分析。Kibana可视化面板。支持搜索日志、做Dashboard大盘、设置告警规则是日常排查问题的入口。一句话总结这个架构的流动路径业务日志 → Filebeat → Kafka → Logstash → Elasticsearch → Kibana。后面所有的工作都是围绕这条链路的每一环去优化。3. 核心链路拆解日志从产生到你看得见的完整旅程在动手部署之前把链路里每个环节的原理和细节搞透比急着跑起来重要得多。下面按日志流动的顺序把每一段的原理和关键配置讲清楚。3.1 采集端Filebeat如何做到轻量又不漏日志采集最怕两件事一是Agent本身太耗资源影响业务机器二是日志产生太快Agent来不及读或者文件已经被轮转删掉了日志就丢了。Filebeat在这两方面的设计都挺靠谱的。它内部有几个关键状态registry文件记录了每个文件当前读取的偏移量offset。就算Filebeat进程重启、机器重启它也会从registry记录的offset继续读不会从头重发也不会漏掉中间那一段。这个特性在你日常重启Agent或者发布业务版本时特别重要。另一个容易被忽略的配置是multiline。很多业务日志是堆栈异常一个异常跨好几行如果按行采集一个堆栈就会被拆成无数条碎片日志根本无法阅读。必须用多行合并规则把属于同一条日志的多行内容拼接成一条完整记录filebeat.inputs: - type: filestream enabled: true paths: - /data/logs/order-service/*.log fields: app_name: order-service env: prod fields_under_root: true parsers: - multiline: type: pattern pattern: ^[0-9]{4}-[0-9]{2}-[0-9]{2} negate: true match: after注意这个配置的含义pattern指定一行日志开始的特征我这里用的是以日期开头。negate: true表示不匹配该模式的行match: after表示把它们合并到前一条的后面。这样Java堆栈里的每一行以空格或tab开头都会被拼接到上一条日志中整个堆栈成为一条完整记录。实测下来多行规则的正则要严格匹配你日志行首的格式。如果日志行首是时间戳像2025-06-14 10:00:00那正则就得写对格式。很多团队在这省事结果Kibana里一堆被大卸八块的堆栈日志查问题反而更费劲。3.2 缓冲层为什么非要用Kafka直接写ES不行吗我见过不少团队最初是Filebeat直接输出到Elasticsearch的日志量小的时候确实没毛病但到了高峰期就出问题。核心原因是Elasticsearch的写入能力受限于分片数、硬件配置、索引刷新频率等因素索引刷新默认refresh_interval是1秒。如果你持续以高并发往Elasticsearch灌数据集群的CPU和IO会很快被拉高查询性能跟着下降。而且一旦Elasticsearch出现GC卡顿或节点故障Filebeat重试队列一旦积压就会反过来拖累业务机器。Kafka作为夹在中间的缓冲层解决的是生产速度和消费速度不匹配的问题。你只管往Kafka写Kafka的写入性能极高吞吐量可以达到每秒几十万条。下游Logstash要想多慢就多慢慢慢消费、慢慢清洗完全不会影响采集端。与此同时Kafka消息可以保留一段时间默认7天如果下游管道出了故障修复回来后数据还在可以追数据。我当时Kafka的topic配置是分区数12副本数2消息保留时间48小时。分区数要跟下游消费者数量挂钩设计原则是消费者数不超过分区数否则多余消费者会空转。副本数2是成本和可靠性的平衡日志数据不像业务数据那么高敏感没必要全副本拷贝。3.3 解析与清洗Logstash把文本变成结构化数据的魔法Filebeat发到Kafka的消息还是原始的文本行Elasticsearch虽然也能全文检索但你想查出所有订单号为ORD123456的ERROR日志就比较费劲。Logstash的作用就是把非结构化文本转换成结构化JSON。看一个典型的logstash pipeline配置input { kafka { bootstrap_servers kafka-server:9092 topics [app-logs] group_id logstash-app-logs codec json consumer_threads 4 } } filter { if [fields][app_name] order-service { grok { match { message ^%{TIMESTAMP_ISO8601:log_time}\s%{LOGLEVEL:level}\s\[%{DATA:thread}\]\s%{DATA:logger}\s-\s%{DATA:class_name}#%{DATA:method_name}\s*-\s*%{GREEDYDATA:detail_message} } } date { match [log_time, yyyy-MM-dd HH:mm:ss.SSS] target timestamp } mutate { remove_field [message, original] } } } output { elasticsearch { hosts [http://elasticsearch-server:9200] index app-logs-%{YYYY.MM.dd} } }grok是整个Logstash里最核心、也是最让人又爱又恨的插件。它本质是一个正则表达式库把常用的时间、IP、数字、日志级别等格式封装成了命名模式。你只需要按照自己日志的格式拼装一条grok表达式就能把日志拆成字段。我当时为了解析Java应用日志里的类名和方法名调整了好几次正则表达式。实际干活建议直接在线调试工具比如Grok Constructor里先跑通再贴到配置里能省很多时间。还有一个细节date插件。日志里记录的业务时间和Logstash处理时的当前时间往往不同可能是几秒甚至几分钟的延迟而Elasticsearch默认用的是timestamp字段写入时间。如果你用写入时间去Kibana里过滤日志看到的可能跟业务时间对不上排查问题时很误导。所以用date插件把日志里的原始时间覆盖到timestamp让日志的检索时间轴跟业务时间轴保持一致。3.4 存储与检索Elasticsearch索引生命周期和分片的心得索引是Elasticsearch里存储数据的逻辑容器我按天建索引app-logs-2025.06.14好处是显而易见的日志删除只需要删掉过期索引不用逐条delete检索时可以缩小范围到某几天每个索引独立做优化互不影响。但分片数量的设计往往是新手最容易出错的地方。我开始时每个索引分片数设置成了5副本1结果索引特别碎。分片过多带来的问题包括集群维护分片的元数据开销大、小分片查询效率反而下降、单分片数据量很小造成存储浪费。后来我把分片数调整为3实测下来查询和写入性能都稳定了。关于索引生命周期ILM这个是必须配置的。如果没有ILM日志索引会无限增长磁盘总有一天被打爆。ILM策略分几个阶段hot阶段写入频繁SSD存储、warm阶段只读降低副本数、delete阶段超过保留时间删除。我配置的保留策略是根据业务需要来的核心服务日志保留30天普通业务日志保留15天。每天凌晨ILM会检查并自动执行滚动和清理全程无需人工干预。3.5 可视化Kibana的Discover和Dashboard到了Kibana这层其实是把底层能力变成人能看懂的东西。Discover页面是日常排查问题的主场。支持全文搜索、字段过滤、时间范围选择、索引模式切换。我习惯先在Discover里把要看的日志检索逻辑确认好再另存为保存搜索Saved Search后面做Dashboard或告警直接引用。Dashboard大盘则适合团队共用的展示场景。我做了几个比较实用的面板全局日志量趋势按小时统计、各服务错误日志占比饼图、Top10异常日志接口柱状图、以及响应时间过慢的请求日志列表表格。这里想提醒一点Kibana里的时区默认是UTC浏览器访问时会按当前浏览器时区转换但Kibana显示时间时经常会遇到差8小时的问题。原因在于Kibana的时区设置和Elasticsearch存储的时间是UTC的你需要在Kibana的Advanced Settings里把dateFormat:tz设置为Asia/Shanghai否则你看到的时间永远比业务时间慢8个小时。这个坑极其常见。4. 落地实操从零搭建一套可用的分布式日志系统选型和链路原理都清楚了这一节是纯实操环节照着做能搭出一套完整可用的系统。4.1 环境准备和组件版本选择我基于实际经验建议组件版本用以下组合都是稳定版兼容性经过验证组件版本说明Elasticsearch7.10.27.10之后的版本 license 变化比较大老版本积累的踩坑资料多Logstash7.10.2和 ES 同一个大版本避免兼容问题Kibana7.10.2同上Filebeat7.10.2版本跟服务端保持一致最省心Kafka2.13-3.1.0稳定版本配合Zookeeper使用如果你用的是JDK注意Kafka和Elasticsearch都依赖Java建议JDK版本11及以上。另外Elasticsearch默认不允许以root用户运行必须创建独立的系统用户groupadd elsearch useradd elsearch -g elsearch -p es123456 chown -R elsearch:elsearch /usr/local/elasticsearch4.2 Filebeat配置详解日志轮转和多行合并在业务机器上安装Filebeat后配置文件的关键项看3.1节已经给了。这里补充一个特别容易出的问题日志文件的轮转rotation。Java应用普遍用Logback或Log4j2按天或按大小切分日志文件比如order-service.log到当天晚上12点变成order-service.log.2025-06-14。Filebeat在监控一个文件名时如果文件被rename或delete它可能短暂地丢失几秒的日志在文件轮转的间隙。解决方式是Filebeat的配置里要同时监控*.log和*.log.*并开启ignore_older参数来忽略过于老的日志文件filebeat.inputs: - type: filestream enabled: true paths: - /data/logs/order-service/*.log - /data/logs/order-service/*.log.* ignore_older: 48hignore_older的意思是文件最后修改时间超过48小时就不再采集。这个参数防止每次Filebeat启动时把所有历史日志都扫一遍白白浪费带宽和存储。4.3 Logstash pipeline编写格式解析、时间覆盖和字段裁剪Logstash的pipeline配置已经在3.3节展示过了这里补充一个生产环境常见的需求多应用日志用一个pipeline消费但解析规则不同。假设你有order-service和user-service两个应用日志格式不同可以这样处理filter { if [fields][app_name] order-service { grok { match { message order服务的grok表达式... } } } else if [fields][app_name] user-service { grok { match { message user服务的grok表达式... } } } }这个做法的关键是Filebeat采集时一定要给每条日志打上应用标签fields.app_name否则下游根本不知道这条日志来自哪个服务。多应用共用pipeline能减少Logstash实例数量、节省服务器资源但代价是单个pipeline逻辑变复杂。我的建议是先按日志格式分组一个pipeline最多处理2-3种格式的日志。如果业务系统特别多、格式差异特别大宁可拆成多个pipeline、起多个Logstash进程也别把几百行判断逻辑堆在一个配置里后面维护起来真想骂人。4.4 Spring Boot应用如何接入Logback输出JSON格式和TraceId日志能不能被Logstash顺利解析关键在于应用侧输出的日志格式。如果你用的是Spring Boot我强烈建议用logstash-logback-encoder这个库直接把日志输出成JSON格式而不是输出成纯文本再让Logstash用grok去解析。为什么这么做grok解析依赖正则正则性能消耗大、且格式稍微变一点就解析失败。如果应用侧直接输出JSONLogstash只需要指定codec json连grok都不用写性能和稳定性都高了一个量级。在pom.xml添加依赖dependency groupIdnet.logstash.logback/groupId artifactIdlogstash-logback-encoder/artifactId version7.2/version /dependencylogback-spring.xml核心配置appender nameJSON_FILE classch.qos.logback.core.rolling.RollingFileAppender file/data/logs/order-service/app.log/file rollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicy fileNamePattern/data/logs/order-service/app.%d{yyyy-MM-dd}.log/fileNamePattern maxHistory30/maxHistory /rollingPolicy encoder classnet.logstash.logback.encoder.LogstashEncoder customFields{app_name:order-service}/customFields includeMdctrue/includeMdc /encoder /appender这样输出的日志是类似这样的结构化的JSON{ timestamp: 2025-06-14T10:00:00.12308:00, level: ERROR, logger: com.example.OrderController, thread: http-nio-8080-exec-3, message: 订单创建失败, app_name: order-service, trace_id: 8f2e9c6a1b3d4e5f }Logstash那边几乎不需要filtercodec json直接解析性能非常高。TraceId怎么打通全链路这里展开说一下。在一个请求经过多个微服务的时候如果没有一个统一的请求ID你根本没法把用户下单在网关、订单服务、支付服务里的所有日志串联起来。做法是在网关或入口Filter生成一个UUID作为traceId放入MDC。通过HTTP头比如X-Trace-Id向下游传递。下游服务在Filter里从请求头取出traceId再放入自己的MDC。Logback的MDCMapped Diagnostic Context本质是一个ThreadLocal Map贯穿整个请求线程。LogstashEncoder配置了includeMdctrue之后日志会自动把MDC里的所有key-value输出到JSON字段里。这样在Kibana里直接按trace_id搜索一次请求涉及的所有服务日志就全部串起来了。4.5 Elasticsearch索引生命周期策略配置我直接在Kibana的DevTools里创建ILM策略和索引模板PUT _ilm/policy/app-logs-policy { policy: { phases: { hot: { min_age: 0ms, actions: { rollover: { max_size: 50GB, max_age: 1d }, set_priority: { priority: 100 } } }, delete: { min_age: 30d, actions: { delete: {} } } } } }rollover的意思是当前索引超过50GB或写满1天就自动rollover到新的索引。delete阶段设定30天后自动删除。这个策略直接解决了索引无限增长的问题。索引模板的意义在于当第一个app-logs-2025.06.14索引被创建时Elasticsearch会自动套用模板里的settings和aliases包括分片数、副本数、ILM策略等PUT _index_template/app-logs-template { index_patterns: [app-logs-*], template: { settings: { number_of_shards: 3, number_of_replicas: 1, index.lifecycle.name: app-logs-policy } } }从此以后Logstash往app-logs-%{YYYY.MM.dd}写索引时不需要手动建索引模板自动生效。4.6 验证链路是否打通搭完所有组件后验证链路是最后一步。先确认业务日志持续落盘然后依次检查Filebeat是否正常监控文件filebeat -e -d *调日志级别看有没有读取输入。Kafka是否收到了日志用kafka-console-consumer.sh --bootstrap-server kafka-server:9092 --topic app-logs --from-beginning --max-messages 20来观察消费消息。Elasticsearch里有没有索引数据curl http://elasticsearch-server:9200/_cat/indices/app-logs-*看索引是否存在且有文档数。Kibana索引模式是否创建在Kibana的Stack Management里创建app-logs-*索引模式然后在Discover里选时间范围能看到日志刷新就说明全链路OK。整个落地过程大概就是这三件事配置采集端、部署消息管道、定义存储策略。每一步都有现成配置可抄但如果不懂原理一旦出问题就容易抓瞎。所以下面的章节我把自己运维时踩过的坑和排查思路详细列了出来。5. 上线半年后我把踩过的坑一个一个填平系统搭好只是开始真正考验人的是后续的稳定性和调优。下面这些坑基本覆盖了分布式日志系统上线后最容易遇到的几类问题。5.1 时区问题Kibana显示的时间和日志时间对不上这是反馈最多的一个坑。业务日志里明明写着2025-06-14 10:00:00Kibana Discover里看到的时间却是02:00:00差了8个小时。根本原因在链路里有三层时间日志原文里的时间业务服务器本地时间、Logstash处理时写入的timestampUTC时间、Kibana展示时按浏览器时区转成的时间。如果Logstash的date插件没有正确解析日志里的时间并覆盖timestampElasticsearch就会用UTC的当前写入时间作为timestampKibana按浏览器时区转换后自然就差了8小时。解决办法就是3.3节里写的date插件。给你个验证技巧在Kibana的Discover里展开一条日志看原始字段里的log_time业务时间和timestamp是否一致。如果相差8小时基本就是date插件没生效或者grok解析的时间字段不对。另外如果你在index template里自定义了time_field比如log_time还要在索引模式的Time field里改成对应字段否则Kibana仍然默认用timestamp做时间过滤。5.2 日志太多了ES查询卡顿和集群负载过高日志系统的特点是写多读少但读的瞬间往往是在故障发生时——此时大家的查询需求会集中涌来如果集群性能本来就不行就会雪上加霜。我踩到的第一个问题是索引分片过多。因为按天索引每天有十几个索引每个索引默认5个分片再加上副本就是10个分片集群里积了上百个分片。Elasticsearch每个分片都是一颗独立的Lucene索引分片太多意味着每个查询请求都要在各个分片上并行执行再汇总结果集群的协调节点开销特别大。根治方案就是调整分片数以及用ILM的rollover策略让单个索引的数据量控制在一个合理范围。一般来说每个分片的数据量在10GB到50GB之间比较合适。日志量小的服务甚至可以把分片数设为1。第二个问题是search的深度翻页。Kibana的Discover里翻页翻得比较深时Elasticsearch的from size模式会变得异常缓慢因为每个分片都要取fromsize条数据到协调节点再做全局排序。如果你在Kibana里翻到几千页之后会感觉页面越来越卡就是这个原因。解决办法是不要在Kibana里做深度翻页。Kibana默认只加载前500条记录如果要导出一大段日志去分析建议缩小时间范围或者使用Kibana的Download CSV功能。如果确实需要深度翻页API调用用search_after或者scroll实现。5.3 Filebeat采集吞吐不足日志积压在文件里有一次监控大屏上Kafka的lag指标持续走高说明Filebeat送到Kafka的速度慢了。排查发现是Filebeat的bulk_max_size和worker配置没有根据机器性能调整。默认配置里worker: 1bulk_max_size: 1600。如果业务机器日志量大可以在filebeat.yml里调整output.kafka: hosts: [kafka-server:9092] topic: app-logs worker: 4 bulk_max_size: 4096 compression: gzip codec.json: pretty: falseworker: 4代表有4个并发worker往Kafka写compression: gzip可以减少网络带宽占用Kafka消息压缩后体积减少60%以上。调整后Kafka的lag指标迅速下降。注意这个配置不是越高越好worker太多会占用更多业务机器的CPU和内存。需要观察机器负载再定。5.4 磁盘打爆日志清理策略不生效的排查这套系统运行到第三个月时收到告警说ES节点磁盘使用率超过85%。查了一圈发现ILM的delete阶段没有执行。原因很有迷惑性我配置的ILM策略是min_age: 30d但这里的age是从索引创建时间开始算的不是从写入数据的时间开始算。由于rollover策略是按max_size: 50GB来切分的某一天业务量特别大时索引可能不到24小时就rollover了但有些索引创建后数据量小可能要两三天才会被rollover。结果每个索引的实际年龄差异很大30天统一删除的话最早的索引实际存活了35天以上。解决方案有两种第一把ILM的min_age改小一点比如25d留出时差余量第二更推荐的做法是在ILM的hot阶段用max_age: 1d强制每天rollover一次保证索引年龄和业务日期严格对应这样逻辑最清晰后面对账也方便。另外别忘了给Elasticsearch数据目录的磁盘做监控日志系统一旦磁盘满影响的是整个ES集群的工作而不只是日志写入。6. 一套分布式日志系统搭建完成后我的一些额外建议日志系统跑通之后你会发现它能做的事情远远不止排查问题。我额外琢磨了几个方向也顺手做了一些延伸优化。告警与日志联动。Kibana里的Alerting功能可以正对某个检索条件设置阈值告警比如每分钟ERROR日志超过50条或者某个特定异常关键字出现10次。我配置了针对OutOfMemoryError和ConnectionPoolTimeoutException的告警提前发现过两次线上内存泄漏的苗头比业务侧自己告警还早。这个能力建议一定用起来成本很低、收益很高。日志链路追踪和性能分析。有了统一的日志格式和TraceId之后可以把一次请求在各服务间的耗时串起来。在Kibana里用trace_id搜索然后按时间排序看日志时间戳就能算出每个微服务处理该请求花了多少毫秒。这比专门上APM工具要轻量得多虽然不够精确但日常定位慢请求已经完全够用。我靠这个方法排查过一次网关转发正常但订单服务响应极慢的问题最终定位到是数据库连接池满导致的等待日志链路里时间戳一目了然。日志分类分级存储。不是所有日志都值得存30天。我把访问日志、调试日志的保留期缩短到7天错误日志和业务关键日志保留30天以上。实现方式是在Logstash里按日志级别写不同的ES索引if [level] ERROR or [level] WARN { elasticsearch { index app-logs-error-%{YYYY.MM.dd} } } else { elasticsearch { index app-logs-%{YYYY.MM.dd} } }这样错误日志单独存一份存储成本下降且排查问题时直接进error索引更快。最后分享一个小技巧。Filebeat的registry文件里面记录了每个日志文件的读取偏移量如果你误删了日志或者想重新采集某一段日志可以停掉Filebeat删除/var/lib/filebeat/registry下对应文件再重启Filebeat重新全量读取。但谨慎操作这也意味着所有历史日志都会重新传输一遍Kafka和ES瞬间压力特别大。我在测试环境试过一次生产环境还是老老实实让数据自然流动比较好。分布式日志系统的搭建不是一锤子买卖它是随着业务增长不断调优的过程。但只要你一开始把架构的骨架搭对了采集、缓冲、解析、存储、检索、告警各司其职后面无论日志量怎么增长这套框架都能通过扩展节点和调整参数去消化。希望这篇从选型到落地的完整记录能帮你少走一些我已经走过的弯路。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →