Go 语言项目开发实战
孔令飞
腾讯云专家工程师,前 Red Hat、联想云工程师
41030 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 61 讲
Go 语言项目开发实战
15
15
1.0x
00:00/00:00
登录|注册

21 | 日志处理(下):手把手教你从 0 编写一个日志包

Log.L()
WithContext, FromContext
WithValues
V Level
Info, Infof, Infow
尝试修改函数调用中的数字
实现一个新的Formatter
建议优先选择zap日志包
IAM项目log包的特性
开发日志包的步骤
其他日志记录方法
日志记录方法
log包的Options结构体
IAM项目log包的存放位置
自定义日志输出格式
将日志输出到支持的输出中
创建Logger及各级别日志打印方法
定义日志级别和日志选项
课后练习
总结
IAM项目日志包设计
从0编写一个日志包
日志包开发

该思维导图由 AI 生成,仅供参考

你好,我是孔令飞。
上一讲我介绍了如何设计日志包,今天是实战环节,我会手把手教你从 0 编写一个日志包。
在实际开发中,我们可以选择一些优秀的开源日志包,不加修改直接拿来使用。但更多时候,是基于一个或某几个优秀的开源日志包进行二次开发。想要开发或者二次开发一个日志包,就要掌握日志包的实现方式。那么这一讲中,我来带你从 0 到 1,实现一个具备基本功能的日志包,让你从中一窥日志包的实现原理和实现方法。
在开始实战之前,我们先来看下目前业界有哪些优秀的开源日志包。

有哪些优秀的开源日志包?

在 Go 项目开发中,我们可以通过修改一些优秀的开源日志包,来实现项目的日志包。Go 生态中有很多优秀的开源日志包,例如标准库 log 包、glog、logrus、zap、seelog、zerolog、log15、apex/log、go-logging 等。其中,用得比较多的是标准库 log 包、glog、logrus 和 zap。
为了使你了解开源日志包的现状,接下来我会简单介绍下这几个常用的日志包。至于它们的具体使用方法,你可以参考我整理的一篇文章:优秀开源日志包使用教程

标准库 log 包

标准库 log 包的功能非常简单,只提供了 Print、Panic 和 Fatal 三类函数用于日志输出。因为是标准库自带的,所以不需要我们下载安装,使用起来非常方便。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了如何从零开始编写一个日志包,并详细讲解了Go生态中常用的开源日志包,包括它们的特点、适用场景以及在实际项目中的选择建议。作者以实际项目需求为例,说明了如何基于现有日志包进行二次开发,以满足特定需求。文章还展示了如何从零开始编写一个具备基本功能的日志包,包括定义日志级别和选项、创建Logger及各级别日志打印方法、将日志输出到支持的输出中以及自定义日志输出格式。此外,还介绍了log包的Options结构体及其各配置项的含义,以及log包实现的丰富的日志记录方法。通过这些步骤,读者可以快速掌握日志包的核心设计思路和实现方法。文章还详细介绍了log包支持的V Level、WithValues函数、WithContext和FromContext方法,以及如何在函数间传递Context实现调用链效果。这些内容使得读者能够全面了解日志包的设计和使用,为他们在实际项目中的日志记录提供了丰富的参考和指导。总之,本文内容丰富,涵盖了日志包的选择、定制和实现,适合开发人员快速了解和掌握相关技术。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 语言项目开发实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(28)

  • 最新
  • 精选
  • ppd0705
    Caller(skip int) 0代表当前层, 1代表上一次调用者,一次类推。 对于log包由于封装了2层(Entry.write --> Debug),所以Caller(2)能得到用户函数的调用栈信息

    作者回复: 回答满分!

    2021-08-04
    16
  • 一念之间
    没啥用,最重要的写入kafak,logstash只字未提,呵呵了

    作者回复: 这些属于微服务/云原生范畴了,引入会给课程带来更大的复杂度。 你说的这些,在 44|技术演进(下):软件架构和应用生命周期技术演进之路 中有介绍

    2022-06-24归属地:广东
    4
  • helloworld
    发现iam项目的log包有个严重的bug, 测试大批量写日志到文件, 只能成功写入一小部分, 比如: defer log.Flush() for i := 0; i <= 20000; i++ { log.Info("hello world") } 只能成功写入299条日志, 预期应该是2万条日志. log包: github.com/marmotedu/iam/pkg/log

    作者回复: github.com/marmotedu/iam/pkg/log 这个包没有bug。 之所以打印了299条,是因为里面有很多log内容是完全重复的,包括时间戳,msg等等,zap会对这些完全一样的log去重。在实际开发中,时间戳,日志内容完全一致概率几乎为0.

    2021-10-28
    2
    3
  • Geek_399957
    如果我需要根据不同的场景输出到不同文件,是否每次都需要新建一个 log 呢,这样做并发情况下是否有问题呢

    作者回复: 是的哈,并发场景下没有问题

    2021-08-14
    2
  • 徐海浪
    尝试将runtime.Caller(2)函数调用中的 2 改成 1 ,看看日志输出是否跟修改前有差异,如果有差异,思考差异产生的原因。 ------ *Entry.write:0 -> cuslog.Info:1 -> main.main:2 -> ... 所以2是打印main函数的文件和行号,1打印的则是Info的文件和行号 还拓展了解到runtime.Caller(n)对日志组件性能的影响及其取舍

    作者回复: 老哥理解的很到位,1/2是文件栈的深度。

    2021-07-29
    2
  • Nio
    IAM 项目 log 包的性能比较大概是什么样子呢

    作者回复: 性能跟github.com/pkg/log性能接近一致。github.com/pkg/log这个包很多生产环境在用,所以iam的log包应用在生产环境完全没问题。 你要感兴趣,可以跟其它包对比下,比如:logrus,zap,glog等。也欢迎在留言区分享对比结果。

    2021-07-13
    2
  • helloworld
    log.Int32("int_key", 10)还有V Level这两处没有get到是干啥用的

    作者回复: log.Int32直接指定了字段类型,log不需要再做反射,这种疾苦方式可以提高性能。 V Level可以允许指定任意优先级的日志级别。你可以参考glog的用法来理解V level。 有时候日志包预定义的日志级别可能不够用,这时候可以试试V Level

    2021-07-13
    2
  • tiny🌾
    log输出文件不存在,会报出panic

    作者回复: 可以提前创建个,或者修改下log包,不存在则新建

    2022-10-19归属地:广东
    1
  • Geek_6bdb4e
    如何实现在不同环境以不同的格式(prod: json, dev: console, local:console+enableColor)输出日志呢

    作者回复: 通过配置文件,配置吧。

    2022-05-17归属地:广东
    1
  • Geek_6bdb4e
    如果服务是部署在docker里面,该如何利用logrotate这个工具实现日志轮转呢

    作者回复: 服务部署在docker种,就不需要用logrotate轮转了。可以直接使用filebeat采集,这些日志采集后就直接删除了

    2022-05-17归属地:广东
    1
收起评论
显示
设置
留言
28
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部