klog bug:仅输出到日志文件,不打印到命令行/stderr

news2024/11/15 15:54:56

一、 问题描述

开发k8s插件,使用klog作为日志工具,开发完成发现在设置将日志打印到文件后,Error级别的日志信息仍然会输出到命令行,过多日志打印会使后期将服务部署于docker有卡死的风险(docker的bug,日志输出过快会卡顿)

二、解决思路

1. 先看命令行参数

在这里插入图片描述
可以看到klog的配置还是很灵活的,根据提示尝试了以下启动参数:
1. go run main.go -log_dir=logs -logtostderr=false
2. go run main.go -log_dir=logs -logtostderr=false -alsologtostderr=false
3. go run main.go -log_dir=logs -logtostderr=false -alsologtostderr=true -stderrthreshold=5
4. go run main.go -log_dir=logs -logtostderr=false -alsologtostderr=true -stderrthreshold=0
5. go run main.go -log_dir=logs -logtostderr=false -v=0
6. go run main.go -log_dir=logs -logtostderr=false -v=5
不管根据flag参数怎么调试,Error日志始终会打印到命令行,于是怀疑logtostderr或alsologtostderr参数在klog项目中应该存在bug;

2. 查找bug

先查看alsologtostderr,
在这里插入图片描述

在这里插入图片描述
发现这里有个if,在这个条件下如果alsoToStderr或l.alsoToStderr为true或s >= l.stderrThreshold.get()都会出现把日志打印到命令行的问题:

  1. 那我们把alsoToStderr设置为false,
  2. 再加上一句输出看看参数:fmt.Printf("666666 %v : %v : %v : %v", alsoToStderr, l.alsoToStderr, s ,l.stderrThreshold.get())
  3. 执行go run main.go -log_dir=logs -logtostderr=false -alsologtostderr=false
  4. 输出为666666 false : false : 2 : 2,
  5. 这样看那应该是s >= l.stderrThreshold.get()导致的error日志输出到命令行,这里不知道s为啥为2,我们尝试把stderrThreshold设置>2,
  6. 执行go run main.go -log_dir=logs -logtostderr=false -alsologtostderr=false -stderrthreshold=3
  7. 打印666666 false : false : 2 : 3,同时error日志也不再打印到命令行,并且日志文件里是有error日志的

3. 追查原因

为什么s一直2?向上追查代码调用发现:
在这里插入图片描述
在这里插入图片描述
这次水落石出了,stderrthreshold默认为2,而Error日志的值为2,正常情况下logLevel >= stderrthreshold的都会被输出,即默认情况下Errorlog以上的等级都会被输出,这就是为啥Infolog不会被输出到命令行,error会的原因

4. 问题原因

真正导致我们一直走弯路的是官方的文档和代码中的参数注解:
"stderrthreshold" : "logs at or above this threshold go to stderr when writing to files and stderr (no effect when -logtostderr=true or -alsologtostderr=false ")

从官方给的解释来看,要stderrthreshold生效就必须让logtostderr=falsealsologtostderr=true,因此我们上面的flag参数尝试一直保持这种设置,但是代码里的实现确是:要想stderrthreshold生效就必须让logtostderr=falsealsologtostderr=false才行,这里官方的alsologtostderr与stderrthreshold意义冲突了,应该是个bug

三、总结

被官方坑了一道,浪费了不少时间
总之,要想让klog日志输出到日志文件,且不输出到命令行的,参数配置为:
go run main.go -log_dir=logs -logtostderr=false -alsologtostderr=false -stderrthreshold=3
其中-stderrthreshold的大小看你自己的需求设定在这里插入图片描述
想要全部都不输出,就设定为4即可

参考资料:

  1. https://pkg.go.dev/k8s.io/klog
  2. https://github.com/kubernetes/klog

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

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

相关文章

美国原装二手keysight E4980A(安捷伦)2MHZ LCR表

Agilent E4980A、Keysight E4980A、LCR 表,20 Hz - 2 MHz E4980A 是 Agilent 的 2 MHz LCR 表。LCR表是一种电子测试设备,用于测量电子元件的电感(L)、电容(C)和电阻(R)。LCR 表可…

W800|iot|HLK-W800-KIT-PRO|AliOS|阿里云| |官方demo|学习(1):板载AliOS系统快速上手

板载系统简介 HLK-W800-KIT-PRO 是海凌科电子面向开发者,采用了联盛德 w800 方案,带有一个RGB三色灯,集成了 CHT8305C 温湿度传感器的多功能开发板,用户可以在上面学习、研究嵌入式系统和物联网产品的开发,本套设备运行…

js中的隐式类型转换有哪些

目录一、隐式类型转换条件二、 的隐式类型转换三、 的隐式类型转换四、object 的隐式类型转换探讨 object 的隐式转换执行顺序探讨 Symbol.toPrimitive 属性如何将对象转换为原始值在前端js这门动态弱类型语言中,不仅存在着显示类型转换,还存在许多隐式类…

原画培训机构排名前十名,最新10大原画培训机构

原画培训机构排名出来啦,最新10大原画培训机构出炉,快来看看游戏原画培训机构有哪些吧,对于不知道如何选择靠谱的原画培训班,可以借鉴和参考一下! 1、轻微课 国内人气很高的板绘学习平台,主打课程有日系插…

化解射频和微波设计挑战的六个技巧

即使是最自信的设计人员,对于射频电路也往往望而却步,因为它会带来巨大的设计挑战,并且需要专业的设计和分析工具。这里将为您介绍六条技巧,来帮助您简化任何射频PCB 设计任务和减轻工作压力! 1、保持完好、精确的射频…

从全局变量寻找到Tomcat回显方式

前言 对于回显的获取主要是在ApplicationFilterChain类的lastServicedRequest / lastServicedResponse两个属性,是使用的ThreadLocal进行修饰的,并且,在执行请求的过程中,通过反射修改属性值,能够记录下当前线程的req…

nginx 代理01(持续更新)

1、如果请求是post,而且请求原是188.188.3.171,处理方式403 if ($request_method ~* "POST") # $request_method 等同于request的method,通常是“GET”或“POST” # 如果访问request的method值为POST则返回“o” {set…

MinIO文件系统

3.2 MinIO 3.2.1 介绍 本项目采用MinIO构建分布式文件系统,MinIO 是一个非常轻量的服务,可以很简单的和其他应用的结合使用,它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份…

基于 SmartX 分布式存储的 iSCSI 与两种 NVMe-oF 技术与性能对比

作者:深耕行业的 SmartX 金融团队本文重点SmartX 分布式块存储 ZBS 提供 2 种存算分离架构下的数据接入协议,分别是 iSCSI 和 NVMe-oF。其中,iSCSI 虽然具有很多优势,但不适合支持高性能的工作负载,这也是 SmartX 选择…

《爆肝整理》保姆级系列教程python接口自动化(十九)--Json 数据处理---实战(详解)

简介 上一篇说了关于json数据处理,是为了断言方便,这篇就带各位小伙伴实战一下。首先捋一下思路,然后根据思路一步一步的去实现和实战,不要一开始就盲目的动手和无头苍蝇一样到处乱撞,撞得头破血流后而放弃了。不仅什么…

Java——位运算符

Java——位运算符起因位运算符1.Java中^ 运算符的目的2.Java中& 0xff运算符的目的3.Java中<< 8运算符的目的起因 写这篇文章的起因是在某个地方需要将字节数组byte[]转16进制数字int。见上一篇文章: 进制转换的一些内容&#xff0c;我写出来的方法长这样。 byte[] …

2. RNN 情感评论鉴定

目录1. 加载购物评论数据集2. 构建 RNN 神经网络&#xff08;DNN、CNN、RNN、GNN&#xff09;3. 多循环神经网络原理分析4. LSTM 原理剖析5. LSTM 与 Bi LSTM1. 加载购物评论数据集 file --> setting --> plugins --> Installed --> 搜索【csv Plugin】即可。 …

【前端】浏览器的渲染流程(完整)

本文主要包含以下内容&#xff1a;浏览器渲染整体流程解析 HTML样式计算布局分层生成绘制指令分块光栅化绘制常见面试题浏览器渲染整体流程浏览器&#xff0c;作为用户浏览网页最基本的一个入口&#xff0c;我们似乎认为在地址栏输入 URL 后网页自动就出来了。殊不知在用户输入…

RocketMQ之(一)RocketMQ入门

一、RocketMQ入门一、RocketMQ 介绍1.1 RocketMQ 是什么&#xff1f;1.2 RocketMQ 应用场景01、应用解耦02、流量削峰03、数据分发1.3 RocketMQ 核心组成01、NameServer02、Broker03、Producer04、Consumer1.6 运转流程1.5 RocketMQ 架构01、NameServer 集群02、Broker 集群03、…

NetApp Cloud Volumes ONTAP 将数据复制到云或从云中复制

NetApp Cloud Volumes ONTAP 将数据复制到云或从云中复制&#xff0c;为开发运营和基于云的灾难恢复提供支持。 无论应用位于何处&#xff0c;都可以使用企业级存储,让云存储基础架构更经济、更智能、更合规且更安全。 为什么选择 NetApp Cloud Volumes ONTAP NetApp Cloud …

RocketMQ 第二章

RocketMQ 第二章 7、SpringBoot整合RocketMQ SpringBoot 提供了快捷操作 RocketMQ 的 RocketMQTemplate 对象。 7.1、引入依赖 注意依赖的版本需要和 RocketMQ 的版本相同。 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rock…

本地部署element-plus文档

由于一直使用的前端组件element-plus&#xff0c;所以需要经常看文档&#xff0c;但无奈官网实在不给力&#xff0c;经常报503或者404&#xff0c;大大影响效率和心情&#xff0c;忍无可忍就本地化部署一套解决此问题。 百度了一下大多数都是使用 vscode的live server, 或者放…

JAVA保姆式JDBC数据库免费教程之02-连接池技术

连接池 连接池概念 ​ 概念&#xff1a;其实就是一个容器(集合)&#xff0c;存放数据库连接的容器。 当系统初始化好后&#xff0c;容器被创建&#xff0c;容器中会申请一些连接对象&#xff0c;当用户来访问数据库时&#xff0c;从容器中获取连接对象&#xff0c;用户访问完…

【MySQL】MySQL 架构

一、MySQL 架构 C/S 架构&#xff0c;即客户端/服务器架构。服务器程序直接和我们存储的数据打交道&#xff0c;多个客户端连接这个服务器程序。客户端发送请求&#xff0c;服务器响应请求。 MySQL 数据库实例 &#xff1a;即 MySQL 服务器的进程 &#xff08;我们使用任务管理…

Vue组件间通信的四种方式(函数回调,自定义事件,事件总线,消息订阅与发布)

目录 概述 props配置项-回调函数实现 自定义事件实现 事件总线实现 消息订阅与发布实现 概述 在组件化编程中&#xff0c;组件间的通信是重要的&#xff0c;我们可以有四种方式实现组件间的通信。 分别是&#xff1a;函数回调&#xff0c;自定义事件&#xff0c;事件总…