24|日志处理:日志规范与最佳实践
郑建勋
你好,我是郑建勋。
这节课,我们需要构建项目的日志组件,方便我们收集打印的日志信息。运行中的程序就像一个黑盒,好在日志为我们记录了系统在不同时刻的运行状态。日志的好处主要有下面四点。
打印调试:日志可以记录变量或者某一段逻辑,记录程序运行的流程。虽然用日志来调试通常被人认为是技术手段落后,但它确实能够解决某些难题。例如,一个场景线下无法复现,我们又不希望对线上系统产生破坏性的影响,这时打印调试就派上用场了。
问题定位:有时候,系统或者业务出现问题,我们需要快速排查原因,这时我们就要用到日志的功能了。例如,Go 程序突然 panic,被 recover 捕获之后,打印出当前的详细堆栈信息,就需要通过日志来定位。
用户行为分析:日志的大量数据可以作为大数据分析的基础,例如可以分析用户的行为偏好等。
监控:日志数据通过流处理生成的连续指标数据,可以存储起来并对接监控告警平台,这有助于我们快速发现系统的异常。监控的指标可能包括:核心接口调用量是否突然下降或上升,核心的业务指标(GMV 是否同比和环比稳定,是否出现了不合理的订单,是否出现了零元或者天价账单)等。
标准库 log
而 Go 语言标准库就为我们提供了一个简单的 log 日志库,我们先从它的使用方法讲起。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了日志处理在软件开发中的重要性以及Go语言中日志处理的规范与最佳实践。首先介绍了标准库log的使用方法和局限性,然后提出了工业级日志组件应该具备的特性,如不同环境的输出行为、日志分级、结构化输出、日志文件切割等。接着详细介绍了Go语言中比较知名的日志库Zap,以及其在内存分配量与速度方面的优势。文章还介绍了Zap的使用方法,包括Logger和SugaredLogger的区别,以及如何定制自己的Logger。最后,文章提到了日志切割的能力,并举例介绍了如何将日志切割组件集成到Zap中。通过本文的总结,读者可以快速了解日志处理的重要性,以及在Go语言中如何使用标准库log和Zap来实现高效的日志处理。文章内容涵盖了日志处理的重要性、Go语言中日志处理的规范与最佳实践,以及Zap日志库的特点和使用方法,为读者提供了全面的日志处理知识。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 进阶 · 分布式爬虫实战》,新⼈⾸单¥68
《Go 进阶 · 分布式爬虫实战》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(8)
- 最新
- 精选
- 奕建议把 Github 地址贴出来,只放到之前的章节里面,不太方便找到
作者回复: https://github.com/dreamerjackson/crawler
2022-12-06归属地:广东2 - Geek_cd6159gopkg.in/natefinch/lumberjack.v2 这个package怎么import成功啊 弄了半天都解决不了import问题
作者回复: 看一下需不需要修改goproxy?
2022-12-14归属地:美国 - Geek_8ed998驴头不对马嘴,v0.1.1tag中根本没有log包,到了v0.1.2才有,而在1.1中又使用了log.NewFilePlugin。能不能上点心2023-07-12归属地:上海14
- 牙小木如果发现说的内容和贴的代码执行有偏差,可以借鉴以下代码,结合lumberjack,zap,log实现的一个简单的日志写入 ``` logger := &lumberjack.Logger{ Filename: "./logs/app_info.log", MaxSize: 5, // 日志的最大大小,以M为单位 MaxBackups: 3, // 保留的旧日志文件的最大数量 MaxAge: 28, // 保留旧日志文件的最大天数 Compress: false, } log.SetOutput(logger) for i := 0; i < 100; i++ { log.Printf("This is log entry %d", i) time.Sleep(time.Second) // 模拟日志写入间隔 } core := zapcore.NewCore( zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()), zapcore.AddSync(logger), zap.InfoLevel, ) loggerInstance:=zap.New(core) zap.ReplaceGlobals(loggerInstance) // 写入一些日志 for i := 0; i < 100; i++ { zap.L().Info("This is anothr log entry", zap.Int("entryNumber", i)) time.Sleep(time.Second) // 模拟日志写入间隔 } defer loggerInstance.Sync() ```2023-08-18归属地:北京2
- 牙小木作者提到,本章代码是 https://github.com/dreamerjackson/crawler/releases/tag/v0.1.1 ,把这样的链接贴到文章末尾不就好了吗。 但是这个是不对的,因为没有log文件夹,写的人不仔细check,审的人也没有吗, 这是在极客时间上看到犯这种小错误最多的一个专栏了。还有王法吗,还有法律吗,狗头.JPG2023-08-18归属地:北京1
- Geek_755040怎么实现同时输出到命令行和日志呢,日志怎么按照日期进行拆分2023-06-08归属地:中国台湾
- 翡翠虎日志的规范那一段是不是漏了内容,就那一点吗?后续的监控、告警跟日志有关联性吗?怎么设置日志,才能够既保障错误排查,又满足可观测性需求呢?2022-12-20归属地:广西
- 抱紧我的小鲤鱼个人觉得原因有二 1. 易用性 2. 性能2022-12-05归属地:江苏
收起评论