前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >字节RPC框架Kitex的日志库klog竟然这么小巧!

字节RPC框架Kitex的日志库klog竟然这么小巧!

作者头像
白泽z
发布于 2022-08-18 06:30:14
发布于 2022-08-18 06:30:14
9490
举报
文章被收录于专栏:Go与云原生开发Go与云原生开发

前言

这篇文章将着重于分析字节跳动开源的RPC框架Kitex的日志库klog的源码,通过对比Go原生日志库log的实现,探究其作出的改进。

为了平滑学习曲线,我写下了这篇分析Go原生log库的文章,希望你可以对比阅读:https://juejin.cn/post/7103790667595268126

本文的分析基于:github.com/cloudwego/kitex/pkg/klog的源码。

klog库的使用

结果如下:

klog.xxx能直接打印日志的原因

通过观察源码,klog包的default.go文件中,封装了三类日志的打印的函数提供直接使用:普通日志、格式化的日志、格式化的Context日志

每一类包含了7个的日志输出级别的函数可使用:InfoDebugNoticeWarnErrorFatalTrace

并且这21个函数中频繁使用到了一个logger实例,只要我们引入klog包,logger就会完成初始化,并且作为默认的log实例。

可以看到logger实例默认的日志打印级别是LevelInfoklog通过常量计数器定义了0~6种日志级别:

FullLogger接口

默认的logger实例是通过defaultLogger结构初始化的,且defaultLogger结构实现了FullLogger接口定义的所有函数(接口定义了上面说的三类,每一类7种日志打印函数)

并且观察defaultLogger结构的属性stdlog,就是Go原生的日志库log定义的Logger类型,因此klog的所有日志操作,最终都是借助Go原生log库实现的。

相当于klog在Go原生log库的基础上对格式化输出日志打印级别作了封装,便于直接使用。

串联一下日志打印函数执行的过程:

  • main函数中调用:klog.Info("一条普通的日志")
  • • 进一步调用初始化好的defaultLogger实例(名为logger)的实现自FullLogger接口的函数:logger.Info()
  • • 进一步调用ll.logf()函数(下面重点分析

ll.logf()

上面的这三类共21个日志打印函数最终都调用了ll.logf()方法,因此ll.logf()也是klog库的核心函数,看一下代码:

  • • 日志过滤:如果调用的打印函数代表的日志级别低于logger实例初始化的日志级别,则不会打印(如默认级别是LevelInfo == 2,则调用klog.Trace()将被过滤)
  • • 格式化打印信息存入msg
  • • 调用Go原生日志库logOutput()函数,打印日志(这一部分在上一篇分析Go的log库的文章中已经充分讲解)

关于calldepth的问题

calldepth表示调用层数,这里声明了4,是为了配合获取调用日志打印函数的文件名和所在行数。

  • calldepth == 0,表示获取调用runtime.Caller(calldepth)的文件名和行数
  • calldepth == 1,表示获取调用std.Output()的文件名和行数
  • calldepth == 2,表示获取调用ll.logf()的文件名和行数
  • calldepth == 3,表示获取调用logger.Info()的文件名和行数
  • calldepth == 4,表示获取调用klog.Info()的文件名和行数(也就是main.go文件)

基于klog再度进行封装,在打印日志获取文件名时可能会有问题,下面是摘自Kitex文档的一句描述:

猜测原因就是klog的封装,固定了calldepth == 4,确保其在获取文件信息时能定位到main.go文件中,而如果对klog再封几层,会导致calldepth需要更大才能定位到最外层main.go文件,而这个值并不能通过klog的提供的实现进行修改。

在初始化时通过log.New()函数指定了日志输出的位置需要打印的前置信息(文件名、行数、日期)

定制自己的Logger

可以使用klog.SetLogger()来替换掉默认的logger实现,需要传入一个实现了所有FullLogger接口中定义的方法的实例。

值得注意的是:SetLogger()函数并非是并发安全的,这个方法不应该在你使用了默认的defaultLogger定义实例之后再去使用(会覆盖掉默认的logger实例)。

当然完全重新定制比较复杂,大多数时候,我们只需要在默认的logger基础上重定向日志输出或者修改默认日志级别即可:

下面修改日志打印级别为Notice(高于Info),并且重定向日志的输出:

这里指定了日志输出到文件log.txt中,并且因为Info级别低于声明的Notice,因此日志输出操作被忽略:

小结

通过分析,我们发现klogGo原生log库的基础上,进行了精简的二次封装,一定程度上约束了打印的日志的内容为:日期 + 时间微秒级 + 调用文件名 + 所在行数 + 日志级别 + 格式化的日志内容,使用十分便捷。

当然它也提供了SetLogger()方法去供你自己实现logger实例,以满足更多的定制化需求。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员白泽 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
android8.0证书安装
adb push ~/Downloads/9a5ba575.0 /data/local/tmp
tea9
2023/03/17
1.1K0
小程序渗透 | 对酒店房间自助售货机的支付漏洞挖掘
住某酒店,一看就是个“正规”酒店。刚刷卡进门,就看到门缝里的小卡片了,床头上还贴这一个,个人微信的一个二维码美其名曰SPA。还贴心的提供了自助售货机购买TT。好奇扫码看了下。是个微信小程序,看界面,感觉可以测试下。发现里面东西的销量真不错哦。
HACK学习
2020/11/03
1.8K0
小程序渗透 | 对酒店房间自助售货机的支付漏洞挖掘
Fiddler/Charles - 夜神模拟器证书安装App抓包
Fiddler/Charles - 夜神模拟器证书安装App抓包 ---- 文章目录 Fiddler/Charles - 夜神模拟器证书安装App抓包 前言 一、软件安装 1.Openssl安装 1.1下载安装 1.2配置环境变量 1.3查看openssl版本,输入命令:openssl version 2.夜神模拟器安装 1.1 下载安装 1.2工具准备,MT管理器 3.Fiddler安装 1.1下载安装 4.Charles安装 二、Charles 安装证书,抓包 1.Charles破解 2.安装证书并导出
EXI-小洲
2022/12/13
2.5K0
Fiddler/Charles - 夜神模拟器证书安装App抓包
Fiddler - 夜神模拟器证书安装App抓包
Fiddler- 夜神模拟器证书安装App抓包 文章目录 Fiddler- 夜神模拟器证书安装App抓包 前言 一、软件安装 1.Openssl安装 1.1下载安装 1.2配置环境变量 1.3查看openssl版本,输入命令:openssl version 2.夜神模拟器安装 1.1 下载安装 1.2工具准备,MT管理器 3.Fiddler安装 1.1下载安装 二、Fiddler 安装证书 1.安装证书并导出 2.格式化证书 3.通过MT管理器将证书配置到模拟器中 4.模拟器WiFi填入Fiddler代理
EXI-小洲
2023/01/11
3.1K0
Fiddler - 夜神模拟器证书安装App抓包
微信小程序反编译
我们在学习一项新技能时,除了认真学习官方的规范、标准和技术文档之外,还需要借鉴和参考其他优秀的产品。新手或独立学习者看到做得好的产品就想学,而往往没有好的学习渠道,因此反编译成为了一个“不太好”但有效的学习方法。闲话少说,以下是从网上搜集加自身成功实践得来的操作步骤,供大家借鉴。 一、环境准备
用户6808043
2022/02/25
7600
fiddler5+雷电模拟器4.0对app抓包设置
这次项目刚好需要对微信小程序进行抓包分析,二话不说拿起手机咔咔一顿连接,发现在备用机苹果上抓包正常,但主的安卓机上证书怎么装都失败,原来安卓7版本以后对用户自行安装的证书不再信任,所以无法抓包。
钢铁知识库
2022/08/20
3K0
fiddler5+雷电模拟器4.0对app抓包设置
太干了,Android 抓包姿势总结!
App 服务端测试基本就是 Web 安全那一套,但如果抓不到服务器的包?哎~就很难受,空报告?
信安之路
2021/09/17
4.9K0
微信小程序 Spdier - OfferShow 反编译逆向(一)
本文需要使用到的工具有: Charles抓包工具、夜神模拟器、微信开发者工具、wxapkg反编译工具CrackMinApp; 提示:需要安装好Charles和夜神模拟器并配置好App抓包环境,以及安装好微信开发者工具 / 反编译工具CrackMinApp Charles&夜神模拟器安装教程:https://blog.csdn.net/EXIxiaozhou/article/details/127767808 微信开发者工具 / 反编译工具CrackMinApp 下载安装:https://blog.csdn.net/EXIxiaozhou/article/details/128110468 该文章涉及到App抓包以及微信小程序反编译逆向等相关的Spider技术
EXI-小洲
2022/12/28
1.6K0
微信小程序 Spdier - OfferShow 反编译逆向(一)
安卓7.0以上安装fiddler证书(模拟器)
Download Fiddler Web Debugging Tool for Free by Telerik
全栈程序员站长
2022/09/08
3K0
安卓7.0以上安装fiddler证书(模拟器)
《吐血整理》高级系列教程-吃透Fiddler抓包教程(27)-Fiddler如何抓取Android7.0以上的Https包-中篇
上一篇中,宏哥讲解和分享了一些如何快速解决的临时应急的的方法,但是小伙伴或者童鞋们是不是觉得是一些头痛医头脚痛医脚的方法,治标不治本,或者是一些对于测试人员实现起来比较有一定难度。所以今天宏哥再介绍和分享一下治本的方法。
北京-宏哥
2022/10/27
3K1
在电脑上解析fidder证书并且移动证书
OpenSSL*下载地址:https://oomake.com/download/openssl 这个链接有Windows版和源码版最新版下载地址,可以满足Windows、LInux、Mac OS系统使用。
小小咸鱼YwY
2020/12/14
1.1K0
安卓7.0+系统抓包方案
最近在帮人写一些自动签到的脚本,涉及到了在安卓7.0+系统中如何对 app 和微信小程序进行抓包的问题。这里记录一下有效的抓包方案。
Chor
2023/01/16
3.8K0
一篇文章带你入门移动安全
这篇文章集合了一些入门移动安全的基础渗透知识,希望可以能给想入门移动安全小伙伴们一些收获。
重生信息安全
2020/07/28
1.6K0
一篇文章带你入门移动安全
如何反编译小程序的源码(微信小程序反编译工具)
git clone https://github.com/qwerty472123/wxappUnpacker.git
全栈程序员站长
2022/08/01
1.3K0
如何反编译小程序的源码(微信小程序反编译工具)
关于手机App的Https抓包
我喜欢用 Mitmproxy 来处理手机 App 抓包之类的工作,本来用它来抓 Https 包是很容易的一件事,只要设置好代理,浏览 mitm.it 按提示安装证书即可,可是当 Android 版本升
LA0WAN9
2021/12/14
1.5K0
关于手机App的Https抓包
在KVM加速的Qemu中运行Android Oreo
本文你将学习到如何在KVM加速的Qemu中运行Android Oreo (8.1.0) 系统,并通过我们的Linux x86_64主机上运行的Burp Suite,转发所有来自Android的流量。你将需要用到以下软件:
FB客服
2019/08/09
5.6K0
在KVM加速的Qemu中运行Android Oreo
微信小程序反编译获取前端代码[通俗易懂]
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说微信小程序反编译获取前端代码[通俗易懂],希望能够帮助大家进步!!!
Java架构师必看
2022/07/29
1.8K0
微信小程序反编译获取前端代码[通俗易懂]
玩转青花瓷Charles抓包神器教程(6)-Charles安卓手机抓包
watchpoints是我github用户名 , 也是我的wechat 用户名,如果我有讲不明白 欢迎提问 今日分享语句: 一点一点去靠近梦想,不抱侥幸的奢望,用踏实浇灌,用努力证明,你可以!
早起的鸟儿有虫吃
2025/04/11
4990
玩转青花瓷Charles抓包神器教程(6)-Charles安卓手机抓包
Charles - 夜神模拟器证书安装App抓包
Charles - 夜神模拟器证书安装App抓包 ---- 文章目录 Charles - 夜神模拟器证书安装App抓包 前言 一、软件安装 1.Openssl安装 1.1下载安装 1.2配置环境变量 1.3查看openssl版本,输入命令:openssl version 2.夜神模拟器安装 1.1 下载安装 1.2工具准备,MT管理器 3.Charles安装 二、Charles 安装证书,抓包 1.Charles破解 2.安装证书并导出 3.开启代理模式 4.证书格式化 5.通过MT管理器将证书配置到模拟器
EXI-小洲
2023/01/11
3K0
burpsuite抓取小程序的数据包(指定DNS)
目标:burpsuite抓取微信小程序的数据包,而且该系统需指定DNS!否则无法访问!
逆向小白
2019/08/18
3.1K0
推荐阅读
相关推荐
android8.0证书安装
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档