Go 进阶 · 分布式爬虫实战
郑建勋
Go 语言技术专家,《Go 语言底层原理剖析》作者
15839 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 58 讲
Go 进阶 · 分布式爬虫实战
15
15
1.0x
00:00/00:00
登录|注册

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
立即购买
登录 后留言

全部留言(8)

  • 最新
  • 精选
  • 建议把 Github 地址贴出来,只放到之前的章节里面,不太方便找到

    作者回复: https://github.com/dreamerjackson/crawler

    2022-12-06归属地:广东
    2
  • Geek_cd6159
    gopkg.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归属地:上海
    1
    4
  • 牙小木
    如果发现说的内容和贴的代码执行有偏差,可以借鉴以下代码,结合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,审的人也没有吗, 这是在极客时间上看到犯这种小错误最多的一个专栏了。还有王法吗,还有法律吗,狗头.JPG
    2023-08-18归属地:北京
    1
  • Geek_755040
    怎么实现同时输出到命令行和日志呢,日志怎么按照日期进行拆分
    2023-06-08归属地:中国台湾
  • 翡翠虎
    日志的规范那一段是不是漏了内容,就那一点吗?后续的监控、告警跟日志有关联性吗?怎么设置日志,才能够既保障错误排查,又满足可观测性需求呢?
    2022-12-20归属地:广西
  • 抱紧我的小鲤鱼
    个人觉得原因有二 1. 易用性 2. 性能
    2022-12-05归属地:江苏
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部