比elk还香的日志平台

news2024/11/14 6:54:26

作者 观测云 产品技术专家 深圳办公室 黄小龙

1_a7e03fada3.jpg

写在前面的话

日志是开发人员记录系统运行状态的最佳手段,是一个系统的重要组成部分。日志通常不属于系统的核心功能,但却是我们了解系统运行用的最多的功能。对于开发和运维人员来说,好的日志可以帮助我们了解系统运行的状态、快速定位解决问题、发现系统瓶颈、预知潜在风险,基于日志我们还能挖掘出业务数据,从而反馈产品改进产生更大的价值。那么什么样的日志算是一个好的日志?基于观测云对日志的处理体系,我们怎么样最大化发挥日志的作用?这是本文将要探讨的范围。

日志收集

在探讨如何对系统产生的日志进行收集之前,非常有必要对日志记录的内容做一些规范引导,我们对日志进行处理、检索和分析时,都是要基于日志记录的内容来进行,所以日志该记录什么?不该记录什么?这个点非常重要。当然如果我们的系统已经产生了大量的日志,并且我们无法对其进行改变,那么我们该做的事是最大化的发挥日志的作用。

日志记录规范

理想中的日志应该记录不多不少的信息,一条好的日志应该记录以下信息:

2023-02-17 00:00:00.000 |pid|level|[service,trace-id,span-id,user-id,biz-id]|thread-name|class-name|method-name : message

参数说明:

  • time:日志产生的时间
  • pid:进程ID
  • level:日志级别,常见的有debug、info、warn、error、fatal
  • service:应用名称
  • trace-id:调用链标识
  • span-id:调用链层级标识
  • user-id:用户标识(可选)
  • biz-id:业务标识(可选)
  • thread-name:线程名称(可选)
  • class-name:类名称(可选)
  • method-name:方法名称
  • message:日志内容

除了合理的记录日志信息以外,我们也要对日志级别、日志格式等进行规范。日志级别优先级从低到高可以分为:TRACE、DEBUG、INFO、WARN、ERROR、FATAL。日志格式也应该做好统一规范,使用格式化的日志结构能够方便扩展添加更多字段,要有日志主要内容字段,额外的信息也要记录在日志上下文中。

有关日志记录规范更多内容可参考这三篇文章:《日志记录的最佳实践》、《最佳日志实践v2.0》、《惊讶!我定的日志规范被CTO在全公司推广了》。

日志采集方案

对于日志记录进行规范后,利用观测云 DataKit 对系统产生的日志进行采集,目前能够支持的采集方式可以分为:

采集日志文件

对于传统的日志处理方式,日志都是直接写到日志文件中的,DataKit支持日志文件的采集方式,具体配置可参考:《文件采集》。

采集容器 stdout 日志

对于 Kubernetes 集群中容器产生的 stdout 日志,通过 daemonset 的方式安装 DataKit 到 Kubernetes 集群中后,DataKit 会默认采集容器的 stdout 和 stderr 日志,具体配置可参考:《容器日志采集》。

远程推送日志

支持直接把应用产生的日志直接推送到 DataKit,例如 Java log4j 和 Python 原生的 SocketHandler 均支持直接把日志推送给远端服务,具体配置可参考:《Socket 日志接入》。

Sidercar方式采集

对于日志直接输出到容器日志文件中的方式,可通过 Sidercar 外接 DataKit 的 logfwd 容器的方式对日志进行采集,logfwd 容器将日志推送至 DataKit,具体配置可参考:《Sidercar 日志采集》。

Kafka 方式采集

对于部分业务将日志数据输入到 Kafka 中,或者对接公有云日志服务产生的日志服务(一般都支持 Kafka 协议消费),DataKit 支持直接从 Kafka 中订阅消费日志,具体配置可参考:《订阅 Kafka 中的数据》。

第三方开源系统对接

已经建设了开源日志采集组件,支持将 Logstash/Filebeat/Fluented 中的数据直接推送至DataKit,具体配置可参考:《Logstash 日志数据接入》、《Filebeat日志数据接入》、《Fluented日志数据接入》。

日志处理

DataKit 对日志数据的处理整体上可以总结为:日志采集、日志处理和日志上报。在日志处理阶段,DataKit 会将采集到的单条日志通过 Pipeline 进行切割处理,再经过 Filter 黑名单规则进行过滤,最终上报到观测云。也就是说观测云对日志的切割处理是在采集器 DataKit 上来执行的,利用边缘计算的能力对日志进行切割处理能够有效缩减日志传输成本,并降低日志延迟。

观测云日志数据格式可以分为两个部分:

  • 日志正文内容: message字段里面承载日志的主要内容,观测云会基于message字段创建全文索引,建议控制此字段的长度,可有效加快全文检索的速度。
  • 日志扩展字段: 日志产生的上下文信息,比如日志产生的主机 host、容器名称 container_name、方法名 method_name 等,通过这些上下文信息可快速定位日志产生的环境信息。建议 Pipeline 切割处理时将这些字段从日志正文内容切割出来,观测云会对扩展字段添加索引,加速基于扩展字段查询日志的速度。

在进行日志处理之前,先来理解一个概念,DataKit 所有日志采集配置都会配置 source 字段,用来区分日志来源,日志处理阶段的设计也都是基于此字段展开的。DataKit 采集的日志会先经过 Pipeline 进行切割处理,Pipeline 是基于日志来源 source 来区分的,不同的日志来源可以配置不同的 Pipeline 脚本进行处理。Pipeline 可以对日志内容进行提取,设置扩展字段和正文内容,通过 Pipeline 切割出关键的字段也可以基于这些字段生成指标,并对这些字段进行监控检测告警等,以一个实际例子说明:

{
    "ip":"172.27.173.221",
    "type":"coslogs",
    "instanceId":"mcos-4549029279",
    "appName":"mcos",
    "methodName":"doElect",
    "level":"INFO",
    "clusterName":"k8s-1",
    "@timestamp":"2023-02-16T13:26:54.263Z",
    "@version":"1",
    "className":"kd.bos.elect.impl.redis.RedisCompeteElectorImpl",
    "time":"2023-02-16T13:26:54.269Z",
    "message":"this query for the table cvp_tda_task_history has not return pkcolumn",
    "line":107
}

对于这条 JSON 格式的日志,如果不进行 Pipeline 切割处理,最终在观测云呈现的日志主要内容就是这段 JSON,不管从日志展示来看,还是日志检索来看,这种效果都非常差。

经过下面的 Pipeline 脚本进行切割处理,对关键字段进行提取,并覆盖了 message 日志正文内容,日志的展示效果和检索效率都会提高很多,更多有关 Pipeline 的使用可参考:《DataKit Pipeline使用手册》、《Pipeline 详细手册》。

日志处理中的过滤器 Filter 黑名单功能,也是基于 Pipeline 切割处理后的关键字段,配置相应的过滤规则,字段命中某些规则就对日志进行过滤,不再上报此条日志。

日志检索分析

日志查看检索是通过查看器进行的,利用观测云查看器的功能可以对日志进行快速检索、关键字段的检索、全文检索等,也可以对日志某些字段进行维度分析等操作。日志检索的效率极大程度上是依赖 Pipeline 对日志进行正确的切割处理,理解了 Pipeline 日志处理可以说是理解了观测云日志的最佳实践。

基于 Pipeline 切割的关键字段,可以生成指标数据,例如统计所有服务日志的内容长度:

日志检测

基于观测云提供的监控器-日志检测,支持对日志的关键字设置告警,对潜在的风险及时预警。日志检测器基于日志来源,可设置筛选关键词,支持基于标签过滤日志,支持维度聚合操作。监控器会产生事件消息,事件消息会按照绑定的告警策略发出告警通知,配置日志 error 关键词检测为例:

  • 日志检测配置

  • 事件通知配置

  • 告警效果

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

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

相关文章

LeetCode【28. 找出字符串中第一个匹配项的下标】

不要用珍宝装饰自己,而要用健康武装身体 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 …

微软亚洲研究院:给张图片普通人也能轻松完成图片编辑

效果 代码 https://github.com/Fantasy-Studio/Paint-by-Example 问题 之前图像编辑使用语言引导,作者研究使用example作为引导来进行图像编辑,直接融合(复制粘贴)会导致明显的融合伪影 利用生成先验:从预训练的文…

事务管理AOP

事务管理 事务回顾 概念:事务是一组操作的集合,它是一个不可分割的工作单位,这些操作要么同时成功,要么同时失败 操作: 开启事务:一组操作开始前,开启事务-start transaction/be…

使用SSH通过FinalShell远程连接Ubuntu服务器

文章目录 SSH远程连接Ubuntu服务器Ubuntu服务器端安装SSH服务用户创建及sudo权限配置Linux账号管理useradd(adduser)userdelusermod切换用户 FinalShell端 参考文献 Windows系统Ubuntu16.04.6(以上版本通用)虚拟机、服务器 SSH远…

飞机大战小游戏

欢迎来到程序小院 飞机大战 玩法: 单机屏幕任意位置开始,点击鼠标左键滑动控制飞机方向,射击打掉飞机,途中遇到精灵吃掉可产生联排发送子弹,后期会有Boss等来战哦^^。开始游戏https://www.ormcc.com/play/gameStart/1…

Java 并发编程面试题——Fork/Join 框架

目录 1.什么是 Fork/Join 框架?2.什么是工作窃取算法?它有什么作用?有什么优缺点?3.如何设计一个 Fork/Join 框架?4.如何使用 Fork/Join 框架?5.Fork/Join 框架的实现原理是什么?5.1.ForkJoinTa…

数据结构-leetcode-数组形式的整数加法

解题图解: 下面是代码: /*** Note: The returned array must be malloced, assume caller calls free().*/ int* addToArrayForm(int* num, int numSize, int k, int* returnSize){int k_tem k;int klen0;while(k_tem){//看看k有几位k_tem /10;klen;}i…

【无公网IP内网穿透】Java支付宝沙箱环境支付,SDK接口远程调试

目录 1.测试环境 2.本地配置 3. 内网穿透 3.1 下载安装cpolar内网穿透 3.2 创建隧道 4. 测试公网访问 5. 配置固定二级子域名 5.1 保留一个二级子域名 5.2 配置二级子域名 6. 使用固定二级子域名进行访问 1.测试环境 MavenSpring bootJdk 1.8 2.本地配置 获取支付…

MapModule模块 基于folium的二次封装,让绘图更简洁

背景 开源库 GpsAndMap 的 MapModule 模块基于 folium 模块进行了二次封装,引入 GpsModule 模块中的GPS坐标类作为数据基础,集成了10种地图瓦片可以直接添加引用,提供了直观便利的图层管理功能。 引入模块 pip install GpsAndMap 模块结构…

将整数S按照指定的进制输出为RR的数据类型为字符串numpy.base_repr

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将整数S按照指定的进制输出为R R的数据类型为字符串 numpy.base_repr 下列代码最后一次输出的结果是? import numpy as np num 10 print("【显示】num:", …

考研408 | 【计算机组成原理】 数据的表示和运算

进位计数制 十进制计数法&#xff1a; 推广&#xff1a;r进制计数法 任意进制-->十进制&#xff1a; 二进制<-->八进制、十六进制&#xff1a; 各种进制的常见书写方式&#xff1a; 十进制-->任意进制&#xff1a; 十进制-->二进制&#xff08;拼凑法&#xff…

七个LLM的狼人杀之夜

深度学习自然语言处理 原创作者&#xff1a;Winnie 在最新一篇论文中&#xff0c;研究团队让一群大语言模型(LLM)开了一局狼人杀游戏。通过多种Prompt方法集成&#xff0c;LLM不仅成功地参与了游戏&#xff0c;还涌现出了信任、欺诈和领导力等团体能力。 Paper: Exploring Larg…

校园网web免认真,大量服务器

服务器加满了&#xff0c;没有几个人来&#xff0c;传点图片看实力 什么方法解web认证方式校园网&#xff1f; 一般的校园网是对学生免费开放的&#xff0c;假如你是学生输入学号密码上网就是了&#xff0c;假如你不是那就是想蹭网了&#xff0c;再假如你不想让管理员或上网行为…

idea部署javaSE项目(awt+swing项目)/idea导入eclipse的javaSE项目

一.idea打开项目 选择需要部署的项目 二、设置JDK 三、引入数据库驱动包 四、执行sql脚本 四、修改项目的数据库连接 找到数据库连接文件 五.其他系统实现 JavaSwing实现学生选课管理系统 JavaSwing实现学校教务管理系统 JavaSwingsqlserver学生成绩管理系统 JavaSwing用…

【mysql】1044 - Access denied for user ‘root‘@‘%‘ to database ‘test_job‘

登录mysql 为新建的库创建账号和授权 创建和授权命令 grant all on test_job.* to job% identified by 12345;flush privileges; 返回信息 grant all on test_job.* to job% identified by 12345 > 1044 - Access denied for user root% to database test_job > 查询…

vscode和HBuilderx设置快捷键注释

一、vscode设置快捷键注释 1.打开vscode&#xff0c;使用快捷键&#xff1a;ctrlshiftp mac的话快捷键是&#xff1a;commandshiftp 然后在行中输入snippets 2.选择“新建”&#xff0c;选择将要配置的文件类型&#xff08;以vue类型为例&#xff09;我这里创建的名字为vue.…

数据安全至上:使用API接口定期备份设备的维修保养记录

在设备管理中&#xff0c;维修保养记录是非常宝贵的信息&#xff0c;不仅记录了设备的维修历史&#xff0c;还有助于未来的决策和分析。然而&#xff0c;数据丢失或损坏可能会导致重大问题。为了确保数据的安全性&#xff0c;定期备份是必不可少的。本文将详细介绍如何使用API接…

牛客: BM7 链表中环的入口结点

牛客: BM7 链表中环的入口结点 文章目录 牛客: BM7 链表中环的入口结点题目描述题解思路题解代码 题目描述 题解思路 用一个哈希表存储链表节点,遍历链表,将节点加入哈希表,如果该节点在哈希表中出现过,意味着该节点是入口节点 题解代码 package mainfunc EntryNodeOfLoop(p…

etcd之读性能主要影响因素

1、Raft模块-线性读ReadIndex-节点之间的RTT延时、磁盘IO 线性读时Follower节点首先会向Raft 模块发送ReadIndex请求&#xff0c;此时Raft模块会先向各节点发送心跳确认&#xff0c;一半以上节点确认 Leader 身份后由leader节点将已提交日志索引 (committed index) 封装成 Rea…

Linux下如何查看正在运行的Nginx使用的配置文件

Linux下如何查看正在运行的Nginx使用的配置文件 1. 查看nginx的进程id2. 查询对应端口的nginx路径3. 使用-t参数获取改进程对应的配置文件路径nginx命令 1. 查看nginx的进程id #查询nginx是9000端口的PID netstat -lntup | grep 90002. 查询对应端口的nginx路径 ll /proc/150…