1. 背景

推荐系统的推荐请求追踪日志,通过ELK收集,方便遇到问题时,可以通过唯一标识sid来复现推荐过程

最近在碰到了几个bad case,需要通过sid来查询推荐日志,但发现部分无法在kibana查询到

2. 分析

推荐日志的整个收集流程如下:

flowchart LR
线上机器日志 --> 平台Flume --> Kafka --> Logstash --> ES

因为整个流程较长,且中间的各个组件也是由不同部门来负责的,其中任一环节数据都有可能丢失,所以排查起来比较困难

2.1 版本信息

Flume: 未知

Kafka: 2.4.0

ELK: 7.17

2.2 ELK排查-日志和配置

首先联系了DB的同学,主要负责ELK,他们首先查看了日志,确认无报错之后,要求先确认Kafka的数据是否有丢失

确认Logstash配置和ES Mapping没有问题

input {
kafka {
add_field => {"myid"=>"hdp_lbg_zhaopin_hrgrecservice_trace_all"}
bootstrap_servers => "xxx.xxx.xxx.xxx:9092"
client_id => "hdp_lbg_zhaopin-hdp_lbg_zhaopin_hrgrecservice_trace_all"
group_id => "hdp_lbg_zhaopin_hrgrecservice_trace_topic"
auto_offset_reset => "latest"
consumer_threads => 1
topics => ["hdp_lbg_zhaopin_hrgrecservice_trace_all"]
codec => json
}
} filter {
if [myid] == "hdp_lbg_zhaopin_hrgrecservice_trace_all" {
json {
source => "message"
} mutate {
convert => { "recOuts" => "string"}
join => {"recOuts" => ","}
add_field => {"context" => "%{traceContext}"}
add_field => {"trace" => "%{traces}"}
remove_field => ["message", "event", "traces", "traceContext"]
} }
} output {
if [myid] == "hdp_lbg_zhaopin_hrgrecservice_trace_all" {
elasticsearch {
hosts => ["ip:port"]
index => "hdp_lbg_zhaopin_hrgrecservice_trace_all-%{+YYYY_MM_dd}"
user =>
password =>
}
stdout { }
}
}

2.2 Kafka排查-Kafka数据是否丢失

然后联系的大数据的同学,他们让我们把Kafka的数据写入Hive中,然后看缺失的数据是否能在Hive中查询到,这样做之后在Hive中查到了缺失的数据,确认Kafka的数据没有问题

缺失的数据是找到在机器上的一条日志,但不在Kibana中的数据即可,因为我们缺失率也是很高的,所以也很容易找到

如果缺失的条数很少,可以选取一段时间对比Hive和Kibana的数据

flowchart LR
线上机器日志 --> 平台Flume --> Kafka --> Hive

2.3 继续ELK排查-数据在哪个环节丢了

确认Kafka数据无误之后,再返回去找DB的同学查ELK问题,DB同学使用另外一个Logstash读取Kafka的数据,然后写入ES,同时开启本地输出,录制了一段时间之后,再在Logstash输出文件中寻找这段时间内缺失数据,发现都找不到,于是确认为Kafka到Logstash丢失数据

flowchart LR
线上机器日志 --> 平台Flume --> Kafka -.-> Logstash

2.4 继续-丢失的日志有何特点

虽然确定了是Kafka到Logstash丢失了数据,但还是无法确定具体原因,考虑过是不是某些日志过大,Logstash无法处理,于是看了单台机器的连续的十几条日志,发现丢失的日志大小有大有小,丢的间隔条数也是毫无规律

2.5 Kafka数据格式-一个消息有多个日志

在毫无头绪的情况下,想去看看Kafka内的数据,于是探查了几条,发现了一个奇怪的现象,Kafka的消息里面有多行日志,之间看起来像是空格拼接了起来,后来知道那是个换行符,如下:

线上机器日志符格式:

A

B

C

Kakfa消息格式:

A\nB

C

所以将探查的数据在Kibana中搜索,发现了规律,对于Kafka的每一条消息,只有第一个日志能写入Logstash,对于上面的数据,A和C能写入,而B不能

对于了别的Logstash集群的配置,发现了问题

我们的Logstash Kafka input配置中是codec => json,而其他的配的是codec => line,也就是说Logstash认为Kafka的一条消息就是一个JSON,拿过来直接转,转化的过程中应该把后面换行符拼接的不合法的部分给丢弃了,而使用codec => line的方式,Logstash会把Kafka的消息按照换行符分割成多个event

不过返回来看,为什么Kafka不是一行日志一条消息呢,在我们机器配置收集日志的Flume中,有个默认选项,“是否聚合”,选择是会将不同行的日志聚合到一起,这就是Kafka数据格式看起来很奇怪的原因,后续消费者,不管是Logstash,还是通过DDS写入Hive,还是自己写代码来消费,都要处理这个换行符

3. 总结

Flume将多行日志聚合成一条消息放入Kafka,Logstash在接收的时候需要配置codec => line再将一个消息转换为多行日志

ELK日志缺失问题排查-多行日志聚合Logstash配置问题的更多相关文章

  1. Fluentd 使用 multiline 解析器来处理多行日志

    转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247500439&idx=1&sn=45e9e0e0ef ...

  2. 写给大忙人的ELK最新版6.2.4学习笔记-Logstash和Filebeat解析(java异常堆栈下多行日志配置支持)

    接前一篇CentOS 7下最新版(6.2.4)ELK+Filebeat+Log4j日志集成环境搭建完整指南,继续对ELK. logstash官方最新文档https://www.elastic.co/g ...

  3. ELK学习笔记之Logstash和Filebeat解析对java异常堆栈下多行日志配置支持

    0x00 概述 logstash官方最新文档.假设有几十台服务器,每台服务器要监控系统日志syslog.tomcat日志.nginx日志.mysql日志等等,监控OOM.内存低下进程被kill.ngi ...

  4. ELK显示多行日志

    1.默认,logstash对日志文件的选取是以单行为单位的:但像log4j这种输出日志经常会是以时间头开始的多行日志: 2.显示多行,需要配置logstash的config: input { file ...

  5. 有了链路日志增强,排查Bug小意思啦!

    在工作中,相信大家最怕的一件事就是听到有人在工作群艾特你:某某功能报错啦... 然后你就得屁颠屁颠的去服务器看日志,日志量少还好点,多的话找起来太麻烦了.不太容易直接定位到关键地方. 东找找西找找,好 ...

  6. Logstash——multiline 插件,匹配多行日志

    本文内容 测试数据 字段属性 按多行解析运行时日志 把多行日志解析到字段 参考资料 在处理日志时,除了访问日志外,还要处理运行时日志,该日志大都用程序写的,比如 log4j.运行时日志跟访问日志最大的 ...

  7. ELK日志系统之通用应用程序日志接入方案

    前边有两篇ELK的文章分别介绍了MySQL慢日志收集和Nginx访问日志收集,那么各种不同类型应用程序的日志该如何方便的进行收集呢?且看本文我们是如何高效处理这个问题的 日志规范 规范的日志存放路径和 ...

  8. Logstash——multiline 插件,匹配多行日志

    本文内容 测试数据 字段属性 按多行解析运行时日志 把多行日志解析到字段 参考资料 在处理日志时,除了访问日志外,还要处理运行时日志,该日志大都用程序写的,比如 log4j.运行时日志跟访问日志最大的 ...

  9. 【Go语言探险】线上奇怪日志问题的排查

    最近在日志中发现一些奇怪的日志,大致长这样: Error 2020-08-28 06:59:38.813+00:00 ... _msg=get immersion context, fetch tra ...

  10. Python正则处理多行日志一例

    正则表达式基础知识请参阅<正则表达式基础知识>,本文使用正则表达式来匹配多行日志并从中解析出相应的信息. 假设现在有这样的SQL日志: SELECT * FROM open_app WHE ...

随机推荐

  1. 面对Centos7系统的openssl版本升级

    CentOS7的版本系统,默认的OpenSSL的版本为OpenSSL 1.0.2k-fips 26 Jan 2017.但是openssl需要的版本需要较高的版本.通过下载最新的openssl版本.对o ...

  2. 如何修改npm包源码后,重新npm包的时候能是修改后的版本

    肯定是clone一份到gitHub啦 保存一份修改后的npm包到自己的私有库 npm 安装 git 仓库的方式 npm install <git remote url> 例如 npm in ...

  3. lodash已死?Radash库方法介绍及源码解析 —— 异步方法篇

    写在前面 tips:点赞 + 收藏 = 学会! 我们前面已经介绍了 radash 的相关信息和所有 Array 相关方法,详情可前往主页查看. 本篇我们继续介绍radash中异步相关的方法. 所有方法 ...

  4. C 语言编程 — 运算符

    目录 文章目录 目录 前文列表 运算符 算数运算符 自增.自减运算符 比较运算符 逻辑运算符 位运算符 赋值运算符 逗号运算符 sizeof 运算符 杂项运算符 运算符的优先级 前文列表 <程序 ...

  5. 西门子PLC设备如何接入AIRIOT物联网低代码平台 ?

    西门子PLC设备广泛应用于工业控制领域,高性能和稳定是它最大的优势.下面我们要把西门子300 1200 1500 PLC设备连接到AIRIOT物联网低代码平台,具体操作如下所示: 西门子驱动配置(配套 ...

  6. 基于Python实现MapReduce

    一.什么是MapReduce 首先,将这个单词分解为Map.Reduce. Map阶段:在这个阶段,输入数据集被分割成小块,并由多个Map任务处理.每个Map任务将输入数据映射为一系列(key, va ...

  7. FMEA学习之PFMEA

    一.基础介绍 FMEA 是 Faliure Mode Effect Analysis 简称,翻译过来叫做失效模式分析,按我的理解,用白话说出来就是:对导致不符合生产质量不符合客户要求的问题会产生多么严 ...

  8. FFmpeg开发笔记(二十三)使用OBS Studio开启RTMP直播推流

    ​OBS是一个开源的直播录制软件,英文全称叫做Open Broadcaster Software,广泛用于视频录制.实时直播等领域.OBS不但开源,而且跨平台,兼容Windows.Mac OS.Lin ...

  9. grafan+cadvisor+prometheus监控docker

    grafan+cadvisor+prometheus监控docker: 运行cadvisor: docker run \ --volume=/:/rootfs:ro \ --volume=/var/r ...

  10. Swift Lazy计算属性的线程安全分析

    一.代码示例 // // ViewController.swift // LazyTest // // Created by lilun.ios on 2021/7/30. // import UIK ...