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

news2024/12/22 14:18:46

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

0. 目录

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

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: 10s

clients:
  - url: http://{lokiIp}:3100/loki/api/v1/push

scrape_configs:
- job_name: buInfoLog17
  pipeline_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: jsonFormatD
        template: '{"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: jsonFormatD
  static_configs:
  - targets:
      - localhost
    labels:
      job: buInfoLog17
      __path__: /var/log/*info.log

3. 注意事项

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

  1. 这里用到了三个stage,分别是:
    1.1 Parsing stages - regex
    1.2 Transform stages - template
    1.3 Action stages - output
  2. 上面的regex Stage中的正则表达式,在message信息的提取中使用了TrimSpace,其目的是去除所捕获到的 \n 换行符,让最终的字符串满足JSON格式。(一开始我们是尝试在正则匹配阶段就丢弃掉这个换行符,但实际测试过程中却始终无法生效,而GPT给出的答案也是互相打架)

4. 参考

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

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

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

相关文章

没有广告的浏览器(AdBlock)

AdBlock是一个广告拦截器&#xff0c;可以帮你拦截所有浏览网站上的广告。 安装&#xff1a; 有梯子 1、官网 https://getadblock.com/zh_CN/ 2、点击【以及获得Adblock】跳转浏览器->扩展程序->插件详情页&#xff0c;目前支持 Chrome Firefox Edge Safari 浏览器&am…

KaiwuDB CTO 魏可伟:多模架构 —“化繁为简”加速器

以下为浪潮 KaiwuDB CTO 魏可伟受邀于7月4日在京举行的可信数据库发展大会发表演讲的实录&#xff0c;欢迎大家点赞、收藏、关注&#xff01; 打造多模引擎&#xff0c;AIoT数据库探索之路 01 何为“繁”&#xff1f; 工业 4.0 时代&#xff0c; 物联网产业驱动数据要素市场不…

H3C-Cloud Lab实验-PPP实验

实验拓扑图&#xff1a; 实验需求&#xff1a; 1. R1 和 R2 使用 PPP 链路直连&#xff0c;R2 和 R3 把 2 条 PPP 链路捆绑为 PPP MP 直连 2. 按照图示配置 IP 地址 3. R2 对 R1 的 PPP 进行单向 chap 验证 4. R2 和 R3 的 PPP 进行双向 chap 验证 实验步骤&#xff1a; …

SkipList

文章目录 SkipList理解跳表从单链表说起查找的时间复杂度空间复杂度插入数据更高效的方式维护索引代码实现索引的抽取概率算法 举例插入元素 删除数据总结为什么Redis选择使用跳表而不是红黑树来实现有序集合 SkipList 理解跳表从单链表说起 在原始单链表中查找元素&#xff…

C# Linq 详解三

目录 概述 十三、Sum / Min / Max / Average 十四、Distinct 十五、Concat 十六、Join 十七、ToList 十八、ToArray 十九、ToDictionary C# Linq 详解一 1.Where 2.Select 3.GroupBy 4.First / FirstOrDefault 5.Last / LastOrDefault C# Linq 详解二 1.OrderBy 2.O…

HOT64-搜索二维矩阵

leetcode原题链接&#xff1a;搜索二维矩阵 题目描述 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非递减顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回…

Leetcode每日一题:979. 在二叉树中分配硬币(2023.7.14 C++)

目录 979. 在二叉树中分配硬币 题目描述&#xff1a; 实现代码与解析&#xff1a; dfs&#xff08;后序遍历&#xff09; 原理思路&#xff1a; 979. 在二叉树中分配硬币 题目描述&#xff1a; 给定一个有 N 个结点的二叉树的根结点 root&#xff0c;树中的每个结点上都对…

宋浩高等数学笔记(一)函数与极限

b站宋浩老师的高等数学网课&#xff0c;全套笔记已记完&#xff0c;不定期复习并发布更新。 章节顺序与同济大学第七版教材所一致。

C++虚函数学习

VC6新建一个单文档工程&#xff1b; 添加一个一般类&#xff1b; 生成的Shape.cpp保持不变&#xff1b; #include "Shape.h"#ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]__FILE__; #define new DEBUG_NEW #endif// // Construction/Destruction //Shap…

Unity平台如何实现RTSP转RTMP推送?

技术背景 Unity平台下&#xff0c;RTSP、RTMP播放和RTMP推送&#xff0c;甚至包括轻量级RTSP服务这块都不再赘述&#xff0c;今天探讨的一位开发者提到的问题&#xff0c;如果在Unity下&#xff0c;实现RTSP播放的同时&#xff0c;随时转RTMP推送出去&#xff1f; RTSP转RTMP…

使用Google Chrome浏览器打开Vue项目报错“Uncaught runtime errors”——已解决

使用Google Chrome浏览器打开Vue项目报错&#xff1a; Uncaught runtime errors:ERROR Identifier originalPrompt has already been declared SyntaxError: Identifier originalPrompt has already been declared问题原因&#xff1a; Google Chrome浏览器安装了插件跟Vue项…

2023年最新水果编曲软件FLStudio21.0.3.3517中文直装完整至尊解版下载

2023年最新水果编曲软件FLStudio21.0.3.3517中文直装完整至尊解版下载 是最好的音乐开发和制作软件也称为水果循环。它是最受欢迎的工作室&#xff0c;因为它包含了一个主要的听觉工作场所。 最新fl studio 21有不同的功能&#xff0c;如它包含图形和音乐音序器&#xff0c;帮助…

Nginx Linux设置开机自启动

使用如下命令 vi /lib/systemd/system/nginx.service 创建并编辑文件将以下代码黏贴至此文件中 [Unit] Descriptionnginx Afternetwork.target[Service] Typeforking TimeoutSec0 #防止启动超时 Userroot Grouproot criptionnacos Afternetwork.target[Service] Typeforking T…

哈希的应用(1)——位图

计算机存储单位的常用知识 2^30大约等于10亿 1byte8bit--一个字节等于八个比特位 左移操作符<<表示将值从底地址到高地址的方向移动。 bitset<-1>&#xff0c;开了2^32个bit512MB1GB 位图概念 面试题 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符…

Kerberos协议详解

0x01 kerberos协议的角色组成 Kerberos协议中存在三个角色&#xff1a; 客户端(Client)&#xff1a;发送请求的一方 服务端(Server)&#xff1a;接收请求的一方 密钥分发中心(Key distribution KDC) 密钥分发中心分为两个部分&#xff1a; AS(Authentication Server)&…

Linux下JDK版本与安装版本不一致问题

目录 一. &#x1f981; 前言二. &#x1f981; 操作流程三. &#x1f981; 总结四. &#x1f981; Happy Ending 一. &#x1f981; 前言 最近重新安装了centos7.9,针对以前遇到的Java版本不一致的情况, 提出了另一种方法,该方法简单易行,容易理解。 二. &#x1f981; 操作…

吴恩达机器学习2022-Jupyter1可选实验室: Python 和 Jupyter 笔记本简介

欢迎来到第一个可选实验室&#xff01; 可供选择的实验室包括:提供信息-比如这个笔记本以实际例子加强课堂教材提供分级实验室常规的工作实例 1.1 目标 在本实验中&#xff0c;您将: 对Jupyter笔记本进行简要介绍&#xff0c;参观Jupyter笔记本&#xff0c;了解标记单元格和…

pytorch实现线性回归

转大佬笔记 代码&#xff1a; # -*- coding: utf-8 -*- # Time : 2023-07-14 14:57 # Author : yuer # FileName: exercise05.py # Software: PyCharm import matplotlib.pyplot as plt import torch# x,y是3行1列的矩阵&#xff0c;所以在[]中要分为3个[] x_data torch.…

人物专访 |时静:携手The Open Group,把握时代脉动,助力中国数字经济建设

​ 在由The Open Group主办的2023架构可持续未来峰会上&#xff0c;The Open Group与机械工业出版社进行了战略签约合作仪式&#xff0c;并就备受业界期待的TOGAF标准第10版中文图书发布&#xff0c;以及OPA标准2.1版的本地化工作展开具体合作。 对此&#xff0c;机械工业出版社…

Video Enhancement with Task-Oriented Flow

摘要 Many video enhancement algorithms rely on optical flow to register frames in a video sequence. Precise flow estimation is however intractable; and optical flow itself is often a sub-optimal representation for particular video processing tasks. In thi…