日志收集之--将Kafka数据导入elasticsearch
最近需要搭建一套日志监控平台,结合系统本身的特性总结一句话也就是:需要将Kafka中的数据导入到elasticsearch中。那么如何将Kafka中的数据导入到elasticsearch中去呢,总结起来大概有如下几种方式:
- Kafka->logstash->elasticsearch->kibana(简单,只需启动一个代理程序)
- Kafka->kafka-connect-elasticsearch->elasticsearch->kibana(与confluent绑定紧,有些复杂)
- Kafka->elasticsearch-river-kafka-1.2.1-plugin->elasticsearch->kibana(代码很久没更新,后续支持比较差)
elasticsearch-river-kafka-1.2.1-plugin插件的安装及配置可以参考:http://hqiang.me/2015/08/将kafka的数据导入至elasticsearch/
根据以上情况,项目决定采用方案一将Kafka中的数据存入到elasticsearch中去。
一、拓扑图
项目拓扑图如下所示:
此时消息的整体流向为:日志/消息整体流向Flume => kafka => logstash => elasticsearch => kibana
A.Flume日志收集
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | agent.sources = r1 agent.channels = c1 agent.sinks = s1 agent.sources.r1.type = exec agent.sources.r1.command = tail -F -n 0 /data01/monitorRequst.log agent.sources.r1.restart = true //解决tail -F进程被杀死问题 agent.channels.c1.type = memory agent.channels.c1.capacity = 1000 agent.channels.c1.transactionCapacity = 100 agent.sinks.s1.type = avro agent.sinks.s1.port = 50001 agent.sinks.s1.hostname = IP agent.sources.r1.channels = c1 agent.sinks.s1.channel = c1 |
Flume日志收集过程中踩过的坑可以参考:http://www.digitalsdp.com/Experiencebbs/maintenance/506.jhtml
B.Kafka Sink
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | agent.sources = r1 agent.channels = c2 agent.sinks = s2 agent.sources.r1.type = avro agent.sources.r1.bind = IP agent.sources.r1.port = 50001 agent.channels.c2.type = memory agent.channels.c2.capacity = 1000 agent.channels.c2.transactionCapacity = 100 agent.sinks.s2.type = org.apace.flume.sink.kafka.KafkaSink agent.sinks.s2.topic = XXX agent.sinks.s2.brokerList = IP:9091,IP:9092 agent.sinks.s2.batchSize = 20 agent.sources.r1.channels = c2 agent.sinks.s2.channel = c2 |
二、环境搭建
关于Kafka及Flume的搭建在这里不再详细论述,如有需要请参见本文其它说明。在这里重点说明logstash的安装及配置。
A.下载logstash的安装包;
B.新建kafka-logstash-es.conf置于logstash/conf目录下;
C.配置kafka-logstash-es.conf如下:
logstash的配置语法如下:
1 2 3 4 5 6 7 8 9 10 11 | input { ...#读取数据,logstash已提供非常多的插件,可以从file、redis、syslog等读取数据 } filter{ ...#想要从不规则的日志中提取关注的数据,就需要在这里处理。常用的有grok、mutate等 } output{ ...#输出数据,将上面处理后的数据输出到file、elasticsearch等 } |
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | input { kafka { zk_connect => "c1:2181,c2:2181,c3:2181" group_id => "elasticconsumer" ---随意取 topic_id => "xxxlog" ---与flume中的Channel保持一致 reset_beginning => false consumer_threads => 5 decorate_events => true codec => "json" } } output { elasticsearch { hosts => [ "c4:9200" , "c5:9200" ] index => "traceid" --与Kafka中json字段无任何关联关系,注意:index必须小写 index => "log-%{+YYYY-MM-dd}" workers => 5 codec => "json" } } |
运行logstash命令为:nohup bin/logstash -f /XXX/logstash/conf/kafka-logstash-es.conf &
三、调测过程中遇到的一些坑
A.在集成ELK过程中总以为head插件是必须的,其实head插件为非必需品。elasticsearch仅提供了一个数据存储的煤介,head为了让大家更方便的去查看数据;
B.采用以上方案进行布署时,当系统正常运行时,可以在elasticsearch服务器上http://IP:9200/*中搜索index是否创建成功
参考:https://www.slahser.com/2016/04/21/日志监控平台搭建-关于Flume-Kafka-ELK/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构