当前位置: 首页 > article >正文

Loki实战 - 从零构建JSON日志解析流水线

1. 为什么需要JSON日志解析流水线在日常开发运维中我们经常会遇到这样的场景系统产生的日志五花八门有的是纯文本格式有的是半结构化数据还有的是各种自定义格式。这些日志虽然包含了宝贵的信息但由于格式不统一查询和分析起来非常困难。想象一下你正在排查一个线上问题需要从海量日志中找出特定请求的完整调用链路。如果日志是纯文本格式你可能需要写复杂的正则表达式或者手动翻看大量日志。但如果日志是结构化的JSON格式你只需要一个简单的查询就能快速定位到相关信息。这就是为什么我们需要构建JSON日志解析流水线。通过将非结构化日志转换为结构化JSON我们可以在Grafana中轻松查询和分析日志基于特定字段如请求ID、错误级别快速过滤日志对日志数据进行聚合统计和可视化建立更精准的告警规则2. 环境准备与基础配置2.1 组件安装要构建完整的日志解析流水线我们需要三个核心组件Loki轻量级的日志聚合系统负责存储和索引日志Promtail日志收集代理负责采集日志并发送到LokiGrafana可视化平台用于查询和展示日志最简单的安装方式是使用Docker Compose。创建一个docker-compose.yml文件version: 3 services: loki: image: grafana/loki:latest ports: - 3100:3100 command: -config.file/etc/loki/local-config.yaml volumes: - loki_data:/tmp/loki promtail: image: grafana/promtail:latest volumes: - ./promtail-config.yaml:/etc/promtail/config.yml - /var/log:/var/log command: -config.file/etc/promtail/config.yml grafana: image: grafana/grafana:latest ports: - 3000:3000 volumes: - grafana_data:/var/lib/grafana volumes: loki_data: grafana_data:2.2 Promtail基础配置创建promtail-config.yaml配置文件server: http_listen_port: 9080 grpc_listen_port: 0 positions: filename: /tmp/positions.yaml clients: - url: http://loki:3100/loki/api/v1/push scrape_configs: - job_name: system static_configs: - targets: - localhost labels: job: varlogs __path__: /var/log/*.log这个基础配置会让Promtail收集/var/log目录下的所有.log文件并发送到Loki。但这还没有任何日志解析功能接下来我们会逐步完善它。3. 构建日志解析流水线3.1 理解Promtail的Pipeline StagesPromtail的强大之处在于它的Pipeline Stages机制允许我们对日志进行多阶段处理。典型的解析流水线包含三个阶段Parsing Stages从原始日志中提取信息常用regex,json,logfmtTransform Stages转换提取的数据常用template,replace,multilineAction Stages执行最终操作常用output,labels,timestamp3.2 从非结构化日志提取数据假设我们有以下格式的非结构化日志[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我们需要使用regex阶段提取各个字段pipeline_stages: - regex: expression: ^\[(?Ptime\d{2}:\d{2}:\d{2}\.\d{3})\]\[TID:(?Ptid.*?)\]\[pid:(?Ppid\d)\]\[tid:(?Pthread.*?)\]\[(?Pclass.*?)\]\[(?Plevel\s*\w)\]\s*(?Pmessage.*)$这个正则表达式会提取出time时间戳tid事务IDpid进程IDthread线程名class类名level日志级别message日志内容3.3 转换为JSON格式提取出字段后我们需要将它们组合成JSON格式。使用template阶段- template: source: json_log template: {time:{{.time}},tid:{{.tid}},pid:{{.pid}},thread:{{.thread}},class:{{.class}},level:{{.level}},message:{{.message}}}3.4 输出最终结果最后使用output阶段将JSON字符串作为日志内容发送到Loki- output: source: json_log4. 高级技巧与避坑指南4.1 处理多行日志有些日志如Java异常堆栈会跨越多行。这时需要使用multiline阶段- multiline: firstline: ^\[\d{2}:\d{2}:\d{2}\.\d{3}\] max_wait_time: 3s这个配置表示以时间戳开头的行是新日志的开始最多等待3秒来收集多行日志4.2 添加有用的标签虽然可以在JSON中存储所有信息但为常用字段添加标签能显著提高查询效率- labels: level: class:但要注意标签值必须是有限的、离散的值避免使用高基数字段如请求ID作为标签Loki官方建议每个应用的标签总数不超过10个4.3 时间戳处理如果日志中包含时间戳最好将其转换为Loki使用的格式- timestamp: source: time format: 15:04:05.0004.4 常见问题排查正则表达式不匹配使用(?s:.*)匹配包含换行的内容在regex101.com上测试你的正则表达式JSON格式错误确保所有字符串值都经过转义使用TrimSpace去除多余空白template: {message:{{ TrimSpace .message }}}性能问题复杂的正则表达式会影响处理速度考虑在应用端直接输出JSON格式日志5. 完整配置示例下面是一个完整的Promtail配置示例包含了我们讨论的所有功能server: http_listen_port: 9080 grpc_listen_port: 0 positions: filename: /tmp/positions.yaml clients: - url: http://loki:3100/loki/api/v1/push scrape_configs: - job_name: java_app pipeline_stages: - multiline: firstline: ^\[\d{2}:\d{2}:\d{2}\.\d{3}\] max_wait_time: 3s - regex: expression: ^\[(?Ptime\d{2}:\d{2}:\d{2}\.\d{3})\]\[TID:(?Ptid.*?)\]\[pid:(?Ppid\d)\]\[tid:(?Pthread.*?)\]\[(?Pclass.*?)\]\[(?Plevel\s*\w)\]\s*(?Pmessage.*)$ - template: source: json_log template: {time:{{.time}},tid:{{.tid}},pid:{{.pid}},thread:{{.thread}},class:{{.class}},level:{{ TrimSpace .level }},message:{{.message}}} - labels: level: class: - timestamp: source: time format: 15:04:05.000 - output: source: json_log static_configs: - targets: - localhost labels: job: java_app __path__: /var/log/java/*.log6. 在Grafana中查询结构化日志配置完成后你可以在Grafana中使用LogQL查询这些结构化日志查询特定级别的日志{jobjava_app} | json | levelERROR查询特定类的日志{jobjava_app} | json | classm.XXXX.apigateway.filter.PreHeaderFilter追踪完整请求链路{job~java_app|gateway|service} | json | tid9a77717bb9a34c6eae403df629f3eeb8.203.16800709430010901统计错误级别分布sum by (level) (count_over_time({jobjava_app} | json [1h]))7. 性能优化建议在实际生产环境中还需要考虑以下优化点批量处理调整batchwait和batchsize参数平衡延迟和吞吐量典型配置clients: - url: http://loki:3100/loki/api/v1/push batchwait: 1s batchsize: 1048576 # 1MB合理使用标签只为高频查询字段创建标签避免标签值过多导致索引膨胀日志采样对DEBUG等低级别日志进行采样- sampling: rate: 1000 drop: true source: level value: DEBUG资源限制为Promtail设置内存限制防止处理大量日志时OOM监控Promtail的CPU和内存使用情况在实际项目中这套日志解析流水线已经帮助我们大幅提升了故障排查效率。一个典型的案例是过去需要数小时才能定位的跨服务调用问题现在通过事务ID追踪几分钟内就能找到问题根源。

相关文章:

Loki实战 - 从零构建JSON日志解析流水线

1. 为什么需要JSON日志解析流水线 在日常开发运维中,我们经常会遇到这样的场景:系统产生的日志五花八门,有的是纯文本格式,有的是半结构化数据,还有的是各种自定义格式。这些日志虽然包含了宝贵的信息,但由…...

阿里通义Z-Image-Turbo WebUI图像生成:一键部署,开箱即用

阿里通义Z-Image-Turbo WebUI图像生成:一键部署,开箱即用 1. 快速部署指南 1.1 环境准备与启动 阿里通义Z-Image-Turbo WebUI提供了极简的部署方案,无需复杂配置即可快速启动服务。以下是两种启动方式: 推荐方式:使…...

ComfyUI语音合成新玩法:用VibeVoice快速制作多角色有声书(附声音克隆技巧)

ComfyUI语音合成新玩法:用VibeVoice快速制作多角色有声书(附声音克隆技巧) 有声内容创作正在经历一场技术革命。想象一下,你正在制作一部多人角色对话的有声小说,传统方式需要协调多位配音演员的档期、处理录音棚租用费…...

Qwen-Image-2512-SDNQ商业应用:为电商产品生成炫酷特效主图

Qwen-Image-2512-SDNQ商业应用:为电商产品生成炫酷特效主图 1. 电商视觉营销的痛点与AI解决方案 在当今竞争激烈的电商环境中,产品主图的质量直接影响点击率和转化率。传统产品摄影面临三大挑战: 成本高昂:专业摄影棚、器材、后…...

【UE5】离线语音转文字插件开发实战:从零搭建本地识别系统

1. 为什么需要离线语音识别系统 在游戏开发和工业仿真领域,语音交互正变得越来越重要。想象一下,玩家在VR训练中通过语音指令操控设备,或者工人在嘈杂车间里用语音记录操作日志——这些场景都要求语音识别系统能即时响应且不依赖网络。 去年我…...

Win11系统TrafficMonitor启动失败的常见问题及解决方案

1. Win11下TrafficMonitor启动失败的常见原因 最近有不少朋友跟我吐槽,说在Win11系统上安装TrafficMonitor后死活启动不了。作为一款轻量级的网络流量监控工具,TrafficMonitor确实很实用,但启动失败的问题也确实让人头疼。经过我多次实测和用…...

QtCreator文件命名避坑指南:取消默认小写设置的正确姿势

QtCreator文件命名避坑指南:取消默认小写设置的正确姿势 在Qt开发中,文件命名规范往往直接影响项目的可维护性和团队协作效率。许多开发者在使用QtCreator创建新文件时,都曾遇到过这样的困扰:明明输入了大写字母开头的类名&#x…...

AI净界RMBG-1.4效果实测:逆光人像、毛绒宠物抠图全解析

AI净界RMBG-1.4效果实测:逆光人像、毛绒宠物抠图全解析 1. 开箱即用的发丝级抠图神器 AI净界RMBG-1.4是一款让专业设计师都会惊讶的智能抠图工具。它基于BriaAI团队开源的RMBG-1.4模型构建,将前沿的图像分割技术封装成了任何人都能轻松使用的Web应用。…...

SenseVoice-small边缘AI部署:LoRa网关设备接入语音识别能力方案

SenseVoice-small边缘AI部署:LoRa网关设备接入语音识别能力方案 1. 引言:当LoRa网关“听懂”世界 想象一下,一个部署在偏远农田的温湿度传感器,不仅能通过LoRa网络上报数据,还能“听”到灌溉设备异常的嗡鸣声&#x…...

Windows 系统中通过 composer 快速搭建 ThinkPHP6 开发环境及实战配置指南

1. 环境准备:Windows下搭建ThinkPHP6的基础条件 在Windows系统下搭建ThinkPHP6开发环境,首先需要确保基础软件栈的完整性。这里我推荐使用PHPStudy作为集成环境工具,它内置了Apache/Nginx、PHP和MySQL的一键安装功能,特别适合刚接…...

编程虽有苦有乐,但坚持下去或许能发现其中的乐趣!附C语言示例

众多人在学习编程期间,都卡在了一道关卡之上,那就是怎么都学不会,强行坚持着又特别难受。处于这个时候选择放弃并非是失败,相反地,有可能是一种能够及时止住损失的清醒之举。接下来的这几个堪称经典的C语言题目&#x…...

ROS Noetic下大陆ARS408雷达点云数据解析与RVIZ定制化显示实战(附避坑指南)

ROS Noetic下大陆ARS408雷达点云数据深度解析与RVIZ高级可视化实战 毫米波雷达在自动驾驶和机器人感知领域扮演着关键角色,而大陆ARS408系列以其稳定的性能和较高的性价比受到开发者青睐。本文将带您深入探索ARS408雷达点云数据的内部结构,并掌握RVIZ中P…...

单细胞数据分析进阶:如何用Harmony整合GSE163558多样本数据

单细胞数据分析进阶:如何用Harmony整合GSE163558多样本数据 单细胞RNA测序技术正在彻底改变我们对肿瘤异质性的理解。当面对来自不同患者、不同组织部位(如原发灶和转移灶)的多样本数据时,如何有效整合这些数据并消除批次效应&…...

吵翻了!TP-Link 创始人申请“特朗普金卡”引热议。有些大骂反对,有些理解祝成功

①路由器老牌子 TP-Link 最近冲上热搜引热议了:外媒报道创始人赵建军正大手笔申报特朗普金卡移民,而此时恰逢公司在美遭遇调查,时间点巧到耐人寻味。不少人疑惑:国内生意好好的,为啥非要高价移民?真相藏在它…...

从PAT考试看程序设计:盲文数字识别与字符串存储的实战技巧

从PAT考试看程序设计:盲文数字识别与字符串存储的实战技巧 程序设计竞赛不仅是算法能力的试金石,更是工程思维的综合训练场。在PAT这类权威考试中,像盲文数字识别和字符串存储优化这类题目,往往能折射出程序员解决实际问题的关键能…...

UNIT-00模型处理复杂时序数据:LSTM对比与增强案例

UNIT-00模型处理复杂时序数据:LSTM对比与增强案例 最近几年,处理时间序列数据的模型层出不穷,从传统的统计方法到各种深度学习模型,大家都在寻找那个既能“看得远”又能“看得准”的解决方案。LSTM(长短期记忆网络&am…...

ESP32 IoT固件框架:可裁剪能力驱动的智能设备运行时

1. 项目概述 IoTSmartSysCore 是面向 ESP32 平台(Arduino/PlatformIO 生态)的 IoT 设备核心固件库,专为智能家居与边缘智能终端场景设计。它并非功能堆砌型 SDK,而是一个 可裁剪、可组合、可演进的运行时框架 ,其核…...

使用HY-Motion 1.0和SolidWorks实现工业设计动画生成

使用HY-Motion 1.0和SolidWorks实现工业设计动画生成 1. 工业设计动画的新可能 想象一下这样的场景:你刚完成了一个精密机械部件的三维设计,现在需要向客户展示它的工作原理。传统方式可能需要找动画师,花费数天时间制作演示动画&#xff0…...

Spring Boot实战:5分钟搞定SSE消息推送(含完整代码示例)

Spring Boot实战:5分钟构建股票行情推送系统(SSE全流程指南) 1. 为什么选择SSE技术? 在实时数据推送领域,开发者常面临技术选型的困惑。当我们需要实现股票行情更新这类高频单向数据推送场景时,Server-Sent…...

Stable Yogi Leather-Dress-Collection 实战案例:为智能车内饰提供皮革设计方案

Stable Yogi Leather-Dress-Collection 实战案例:为智能车内饰提供皮革设计方案 最近几年,智能车这个概念越来越火。大家讨论的焦点,往往集中在自动驾驶、智能座舱、车机系统这些“硬核”科技上。但作为一个和设计、材料打过不少交道的人&am…...

UOS Server 20下MLNX_OFED驱动编译踩坑实录:从fput缺失到成功安装的全过程

UOS Server 20下MLNX_OFED驱动编译实战:从内核兼容性到模块修复的深度解析 在国产操作系统生态快速发展的今天,UOS Server 20作为企业级Linux发行版,正逐步获得更多行业用户的青睐。然而,当我们需要在UOS上部署高性能网络设备时&a…...

如何为你的应用选择靠谱的IP归属地数据源?一份给开发者的选型指南

在开发需要显示用户所在地的功能时,一个准确、稳定的数据服务是底层支撑。无论是展示用户属地,还是电商与内容平台的区域化运营,都依赖于此。然而,市面上的数据源质量参差不齐,有的更新不及时导致新分配的地址无法识别…...

别再只会点灯了!用STM32CubeMX配置外部中断控制电机启停(附完整代码)

从GPIO到电机控制:STM32CubeMX外部中断实战指南 在嵌入式开发中,GPIO点灯往往是初学者的第一个实验,但真正的工程应用远不止于此。想象一下工业场景中的紧急停止按钮——当操作员拍下急停开关时,系统必须立即停止所有电机运转&…...

谷歌账号安全提示终极指南:为什么关闭插件就能登录?底层机制解析

谷歌账号安全机制深度解析:插件权限与登录拦截的底层逻辑 每次遇到谷歌账号登录被拦截的提示,大多数用户的第一反应是"换个浏览器试试"。但很少有人追问:为什么关闭插件就能解决问题?这背后涉及一套复杂的安全评估体系。…...

SE(3)-Transformers实战:如何用等变注意力网络处理3D点云数据(附PyTorch代码)

SE(3)-Transformers实战:3D点云处理的等变注意力网络全解析 在3D计算机视觉领域,点云数据因其无序性和非结构化特点,一直是深度学习处理的难点。传统卷积神经网络在处理这类数据时面临诸多挑战,而等变神经网络的出现为这一领域带来…...

LabelImg+YOLOv8:零基础打造专属目标检测模型(附完整数据集配置模板)

LabelImgYOLOv8:零基础打造专属目标检测模型(附完整数据集配置模板) 目标检测技术正在重塑各行各业的智能化进程,从工业质检到智慧零售,从医疗影像到自动驾驶,这项技术让机器真正拥有了"看懂世界"…...

如何在Windows上快速将OpenModelica模型转为FMU并导入Simulink(2023最新版)

2023年Windows平台OpenModelica转FMU全流程指南:零依赖方案与Simulink无缝集成 在工程仿真领域,多工具协同已成为提升工作效率的关键策略。对于使用OpenModelica进行物理建模却需要在Simulink中完成控制算法验证的工程师而言,FMU(…...

Unity铰链四杆机构仿真:从机械原理到代码实现的保姆级教程

Unity铰链四杆机构仿真:从机械原理到代码实现的保姆级教程 在游戏开发和工业仿真领域,机械结构的动态模拟一直是个既有趣又具挑战性的课题。铰链四杆机构作为机械传动的基础构件,其运动轨迹的精确模拟能为游戏中的机关设计、机器人动画乃至工…...

EVA-02企业内网部署方案:基于内网穿透的安全访问实践

EVA-02企业内网部署方案:基于内网穿透的安全访问实践 最近和几个做企业AI应用的朋友聊天,发现大家有个共同的痛点:想用EVA-02这类强大的视觉模型,但又担心直接把服务暴露在公网上有安全风险。公司内部的数据、代码,哪…...

Dify Rerank性能翻倍实操手册:从BM25到Cross-Encoder,3类重排序算法在真实QA场景中的Latency/Recall/MRR对比数据全公开

第一章:Dify Rerank性能翻倍实操手册:从BM25到Cross-Encoder,3类重排序算法在真实QA场景中的Latency/Recall/MRR对比数据全公开在真实企业级问答系统中,重排序(Reranking)是决定最终检索质量的关键环节。我…...