21 | 日志处理(下):手把手教你从 0 编写一个日志包
该思维导图由 AI 生成,仅供参考
有哪些优秀的开源日志包?
标准库 log 包
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了如何从零开始编写一个日志包,并详细讲解了Go生态中常用的开源日志包,包括它们的特点、适用场景以及在实际项目中的选择建议。作者以实际项目需求为例,说明了如何基于现有日志包进行二次开发,以满足特定需求。文章还展示了如何从零开始编写一个具备基本功能的日志包,包括定义日志级别和选项、创建Logger及各级别日志打印方法、将日志输出到支持的输出中以及自定义日志输出格式。此外,还介绍了log包的Options结构体及其各配置项的含义,以及log包实现的丰富的日志记录方法。通过这些步骤,读者可以快速掌握日志包的核心设计思路和实现方法。文章还详细介绍了log包支持的V Level、WithValues函数、WithContext和FromContext方法,以及如何在函数间传递Context实现调用链效果。这些内容使得读者能够全面了解日志包的设计和使用,为他们在实际项目中的日志记录提供了丰富的参考和指导。总之,本文内容丰富,涵盖了日志包的选择、定制和实现,适合开发人员快速了解和掌握相关技术。
《Go 语言项目开发实战》,新⼈⾸单¥68
全部留言(28)
- 最新
- 精选
- ppd0705Caller(skip int) 0代表当前层, 1代表上一次调用者,一次类推。 对于log包由于封装了2层(Entry.write --> Debug),所以Caller(2)能得到用户函数的调用栈信息
作者回复: 回答满分!
2021-08-0416 - 一念之间没啥用,最重要的写入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-2823 - Geek_399957如果我需要根据不同的场景输出到不同文件,是否每次都需要新建一个 log 呢,这样做并发情况下是否有问题呢
作者回复: 是的哈,并发场景下没有问题
2021-08-142 - 徐海浪尝试将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-292 - NioIAM 项目 log 包的性能比较大概是什么样子呢
作者回复: 性能跟github.com/pkg/log性能接近一致。github.com/pkg/log这个包很多生产环境在用,所以iam的log包应用在生产环境完全没问题。 你要感兴趣,可以跟其它包对比下,比如:logrus,zap,glog等。也欢迎在留言区分享对比结果。
2021-07-132 - helloworldlog.Int32("int_key", 10)还有V Level这两处没有get到是干啥用的
作者回复: log.Int32直接指定了字段类型,log不需要再做反射,这种疾苦方式可以提高性能。 V Level可以允许指定任意优先级的日志级别。你可以参考glog的用法来理解V level。 有时候日志包预定义的日志级别可能不够用,这时候可以试试V Level
2021-07-132 - 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