loki技巧 - 结构化log日志文本

将非结构化的log日志信息结构化为JSON格式,以方便在Grafana界面侧的浏览和查询。

0. 目录

      • 1. 需求背景和描述
      • 2. 实现(Promtail侧)
      • 3. 注意事项
      • 4. 后记
      • 5. 参考

1. 需求背景和描述

最近几个月,部门内部开始尝试统一日志收集、查询统计相关的技术栈,并结合自身的业务特点最终放弃传统的ELK方案,转向Grafana开源的轻量级解决方案Loki + Promtail。

最终制定出来的标准是要求上报到Loki的日志必须是结构化的JSON格式,但我们很多历史项目的日志输出采用的是传统的非结构化文本形式,如下面这条样例:

14:22:23.002][TID:9a77717bb9a34c6eae403df629f3eeb8.203.16800709430010901][pid:28764][tid:  XNIO-1 task-6][m.XXXX.apigateway.filter.PreHeaderFilter:?][ INFO] uri: /XX/XXXXX/thumb/ht0313.png

最终需要达到的效果如下:
最终效果

这个需求刚出现时,团队里急性子的同事马上提议 —— 这还不简单,咱们直接把系统里日志输出格式改了不就完事了。

听得我是一脑门汗 —— 大哥,你搁这当毕设做呢?咱这没有“一言不合就要把锅砸了,另立一口”的。咱们先不说基本的"开闭原则",你知道现有的日志格式被多少功能所依赖着吗,你上来使这么大的身段?

最后苦劝暂缓了他的操作,然后加上一点过往浅薄的ELK经验,花了点时间算是把这个需求给满足了。

注:本实现只涉及promtail配置的修改,下游的业务以及上游的Grafana无感知。

2. 实现(Promtail侧)

闲话扯完,本小节步入正文。直接摆出解决方案。

Promtail配置文件:

positions:filename: ./positions.yaml#sync_period: 10sclients:- url: http://{lokiIp}:3100/loki/api/v1/pushscrape_configs:
- job_name: buInfoLog17pipeline_stages:# 底部有官方说明文档的链接# 1. 使用regex从非结构化的log提取出关键信息. 例如这里的time, tid, pid等. (注意提取出来的信息会以键值对的形式存放在`extracted map`中, 让之后的stage使用, 比如我们下面马上要看到的 template stage)- regex:# Flag (?s:.*) needs to be set for regex stage to capture full traceback log in the extracted map.# 这里可以对比上面给出的日志文本样例, 来快速理解该正则表达式的含义, 并且最快速地微调出满足自己需求的正则表达式expression: '^\[(?P<time>(\d{2}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{3}))\]\[TID:(?P<tid>(.*?))\]\[pid:(?P<pid>(.*?))\]\[tid:(?P<thread>(.*?))\]\[(?P<cls>(.*?))\]\[(?P<level>(.*?))\](?P<message>(?s:.*))$'# 2. 将提取出来的数据(存放在`extracted map`中的键值对), 重新组织拼接为JSON格式. - template:-   # 这里的意思是: 将拼接出来的JSON字符串作为value, 'jsonFormatD'为key, 以键值对的形式存放到`extracted map`中.# 注意这里的 message部分我们使用了GO template function: TrimSpace source: jsonFormatDtemplate: '{"time":"{{.time}}","tid":"{{.tid}}","pid":"{{.pid}}","thread":"{{.thread}}","cls":"{{.cls}}","level":"{{.level}}","message":"{{ TrimSpace .message }}"}'#- labels:   #测试成功, 但是按照https://grafana.com/blog/2020/08/27/the-concise-guide-to-labels-in-loki/中的不推荐这么弄, 会大幅增加label所占用的存储空间#    tid:#    time:#    level:# 3. 将上面一步的键值对 jsonFormatD 对应的value推送到Loki中.- output:source: jsonFormatDstatic_configs:- targets:- localhostlabels:job: buInfoLog17__path__: /var/log/*info.log

3. 注意事项

实际实现的过程中还是走了一些弯路,但当完成之后回头看的时候发现:***文档里这不是写得清清楚楚的吗?

  1. 这里用到了三个stage,分别是:
    1.1 Parsing stages - regex 。 负责使用正则表达式从原始的非结构化日志文本中提取出感兴趣的信息。
    1.2 Transform stages - template 。基于上一步的提取结果,重新拼接出满足JSON格式的字符串。
    1.3 Action stages - output 。 将第二步拼接出来的JSON字符串推送给Loki。
  2. 上面的regex Stage中的正则表达式,在message信息的提取中使用了TrimSpace,其目的是去除所捕获到的 \n 换行符,让最终的字符串满足JSON格式。(一开始我们是尝试在正则匹配阶段就丢弃掉这个换行符,但实际测试过程中却始终无法生效,而GPT给出的答案也是互相打架)

4. 后记

本篇博客属于技巧性介绍,所以主体内容其实就那么一点。只是过程中出现的一些意外和老生常谈的问题让我猝不及防:

  1. 本以为这应该是个很普遍的需求,网上稍微找下资料,甚至直接问GPT,十分钟内怎么也解决了。但万万没想到,嘿一个都没找到。这也是本文出现的全部原因。
  2. 老生常谈:RTFD!

5. 参考

  1. Promtail - Pipeline Stages
  2. Promtail - 如何快速调试Promtail? 。这里面包括:如何快速验证配置文件满足语法格式?如何查看各Stage阶段的输出,以定位出是哪个Stage导致的结果不及预期?等等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Zotero翻译插件“zotero pdf translate”——使用时出现广告的问题的解决办法

一、背景&#xff1a; 在Zotero上安装了“zotero-pdf-translate”插件来辅助翻译。今天忽然发现&#xff0c;在使用CNKI翻译引擎的时候&#xff0c;末尾被加上了广告&#xff1a; (查看名企职位领高薪offer&#xff01;--->智联招聘https***dict.cnki.net/ad.html) 如下&…

Netty网络编程

参考文档 https://zhuanlan.zhihu.com/p/550956053 https://zhuanlan.zhihu.com/p/514448867 BIO 读取数据有两个阶段 等待数据就绪&#xff0c;数据到达内核缓冲区读取数据(系统调用)&#xff0c;从内核缓冲区&#xff0c;拷贝至用户缓冲区 BIO两个阶段都会阻塞 BIO编程时&…

分布式数据库HBase,它到底是怎么组成的?

原文链接&#xff1a;http://www.ibearzmblog.com/#/technology/info?id3f432a2451f5f9cb9a14d6e756036b67 前言 大数据的核心问题无非就是存储和计算这两个。Hadoop中的HDFS解决了数据存储的问题&#xff0c;而HBase就是在HDFS上构建&#xff0c;因此Hbase既能解决大数据存…

青岛大学_王卓老师【数据结构与算法】Week05_11_栈与递归_学习笔记

本文是个人学习笔记&#xff0c;素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享&#xff0c; 另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权&#xff0c;请留言作删文处理。 课程视频链接&#xff1a; 数据结构与算法基础…

[sqoop]导入数据

一、覆盖导入 例如维度表&#xff0c;每次导入的数据需要覆盖上次导入的数据。 hive-overwrite参数&#xff1a;实现覆盖导入 hive-import参数&#xff1a;表示向hive表导入 hive-table参数&#xff1a;指定目标hive库表 sqoop import \ --connect jdbc:mysql://hadoop1:3…

哈希表的原理

哈希概念 线性表、树结构的查找方式都是以关键字的比较为基础&#xff0c;查找效率比较低&#xff0c;顺序表的时间复杂度是O&#xff08;n&#xff09;&#xff0c;平衡树中为树的高度&#xff0c;即O&#xff08;logn&#xff09;&#xff0c;搜素的效率取决于搜索过程的元素…

Spring-Interceptor拦截器

使用步骤 申明拦截器bean&#xff0c;并实现HandlerInterceptor接口 true为放行&#xff0c;false为拦截 2.定义配置类&#xff0c;继承WebMvcConfigurationSupport&#xff0c;实现addInterceptors方法&#xff0c;该方法调用具体的拦截器进行拦截 也可以在配子类通过实现W…

【Elasticsearch】DSL查询文档

目录 1.DSL查询文档 1.1.DSL查询分类 1.2.全文检索查询 1.2.1.使用场景 1.2.2.基本语法 1.2.3.示例 1.2.4.总结 1.3.精准查询 1.3.1.term查询 1.3.2.range查询 1.3.3.总结 1.4.地理坐标查询 1.4.1.矩形范围查询 1.4.2.附近查询 1.5.复合查询 1.5.1.相关性算分 …

Set与Map的使用 + 二叉搜索树与哈希桶的大白话讲解和图解+完整代码实现(详细注释)

文章目录 前言一、Set与Map概念及场景模型纯Key模型Key-Value模型 Map 的使用Set 的使用 二、二叉搜索树什么是二叉搜索树代码实现二叉搜索树查找操作插入操作删除操作(难点)cur这个节点没有左子树(cur.left null)cur这个节点没有右子树(cur.right null)cur这个节点没有左右子…

PyTorch深度学习实战(5)——计算机视觉

PyTorch深度学习实战&#xff08;5&#xff09;——计算机视觉 0. 前言1. 图像表示2. 将图像转换为结构化数组2.1 灰度图像表示2.2 彩色图像表示 3 利用神经网络进行图像分析的优势小结系列链接 0. 前言 计算机视觉是指通过计算机系统对图像和视频进行处理和分析&#xff0c;利…

【Python】正则表达式语法入门

目录 正则表达式 1、点&#xff1a;匹配所有字符 2、星号&#xff1a;重复匹配任意次 3、加号&#xff1a;重复匹配多次 4、花括号&#xff1a;匹配指定次数 5、贪婪模式和非贪婪模式 6、反斜杠&#xff1a;对元字符的转义 7、方括号&#xff1a;匹配几个字符之一 8、…

异地使用PLSQL远程连接访问Oracle数据库【内网穿透】

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 转载自cpolar极点云文章&#xff1a;公网远程连接…

cjson的内存泄漏案例

1、当我们使用下面这些创建json对象时&#xff0c;需要用cJSON_Delete();释放&#xff0c;&#xff08;当然&#xff0c;释放父JSON对象后&#xff0c;子JSON对象也会被释放&#xff09; 2、多次释放同一内存空间 在recv_write_property函数中的data&#xff0c;在Equipment_re…

Html基础知识学习——兼容问题与解决方法(十六)

文章目录 1.计算一定要精确&#xff0c;不要让内容的宽高超出我们设置的宽高&#xff0c;在IE6下内容会撑开设置好的宽高2.元素浮动&#xff0c;宽度需要内容撑开&#xff0c;就给里面的块元素都加浮动3.在ie6.ie7下元素要浮动并在同一行 就给这些元素都加浮动4.注意标签嵌套规…

【玩转Linux操作】Linux进程(进程基本介绍,父子进程,终止进程,进程树)

&#x1f38a;专栏【玩转Linux操作】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f354;进程的基本介绍&#x1f354;显示系统执行的进程⭐…

微服务 云原生:K8S 核心组件

参考 Kubernetes 官方文档&#xff0c;简要概述 Kubernetes 中的核心组件用途及部分原理。 一个 K8S 集群&#xff0c;可以分为两个部分&#xff1a; 控制平面(Control Plane)。它是一套管理系统&#xff0c;专门来管理集群节点和服务&#xff0c;为集群做出全局决策&#xff…

使用 @Autowired 为什么会被 IDEA 警告,应该怎么修改最佳?

# 问题原因 关于这个问题&#xff0c;其实答案相对统一&#xff0c;实际上用大白话说起来也容易理解。 1.初始化问题 先看一下Java初始化类的顺序&#xff1a;父类的静态字段 > 父类静态代码块 > 子类静态字段 > 子类静态代码块 > 父类成员变量 > 父类构造代码块…

Linux系统使用(超详细)

目录 Linux操作系统简介 Linux和windows区别 Linux常见命令 Linux目录结构 Linux命令提示符 常用命令 ls cd pwd touch cat echo mkdir rm cp mv vim vim的基本使用 grep netstat Linux面试题 Linux操作系统简介 Linux操作系统是和windows操作系统是并列…

数组与指针

博客内容&#xff1a;数组与指针 文章目录 一、 数组&#xff1f;指针&#xff1f;1.区别与联系大小赋值存储位置 二、指针数组、数组指针&#xff1f;二维数组和二级指针&数组名与数组的区别总结 一、 数组&#xff1f;指针&#xff1f; 数组 相同类型数据的集合 指针 指…

使用SpringBoot+React搭建一个Excel报表平台

摘要&#xff1a;本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 Excel报表平台是一款功能强大、操作简单的系统平台&#xff0c;可以帮助用户上传…