用 Go 从零实现日志包 - 第零篇 序言

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 设计一个日志包,需要考虑的基础功能有日志级别设置、标准输出和文件、输出格式配置、日志的时间戳、文件与打印行号、正文。高级功能有按级别分类输出、支持结构化日志、支持日志轮转。

1 浅谈日志

什么是日志?它不局限于系统日志,程序日志,操作日志,凡是时序相关的、持续产生的数据,都可以称为日志。

日志通过收集、结构化、过滤等步骤后,为开发者排查问题提供了依据,也是监控、报警系统的基石。同时也为我的工作提供了保障

无日志记录时

用(lao)户(ban):小龚,为什么我打完这个关卡没有评分?

我:好的,我去看一下。

半小时后 ... ...

用(lao)户(ban):小龚,知道是什么原因了吗?

我:我复现不了这个问题,暂时不知道是什么原因。

我的内心 OS:这次涨工资没戏了。

有日志记录时

用(lao)户(ban):小龚,为什么我打完这个关卡没有评分?

我:好的,我去查一下日志。

一分钟后 ... ...

我:image.png

我的内心 OS:策划这次涨工资没戏了,嘿嘿。

2 关于日志包

设计一个日志包,需要考虑的基础功能有日志级别设置、标准输出和文件、输出格式配置、日志的时间戳、文件与打印行号、正文。高级功能有按级别分类输出、支持结构化日志、支持日志轮转。

本日志包基于 zap 实现,代码量限制在 800 行左右(不包含测试代码),目前支持的特性有:

  • 颜色输出,告别黑白,尽显尊贵打工人身份
  • 支持多种日志级别,遵守 Go 语言设计哲学
  • 支持日志轮转,日志大小达到一定量级时,对日志进行切割、压缩,并转存
  • 具备 Hook 能力。例如某个级别日志产生时,调用告警接口
  • 兼容标准库 log ,轻松替代标准 log
  • ...

接下来我们将一起,一步一步实现这个日志包的各个功能,最终实现一个可用于生产环境的日志包。每实现一个特性,都会添加可执行的单元测试。

3 目录

  • 输出级别与初始化配置
  • 各级别日志打印函数
  • 结构化输出格式
  • 我想把这玩意儿染成绿的(支持颜色输出)
  • 欲练神功,必先...(日志切割、压缩、转存)
  • 兼容标准库 log

4 其他

本系列文章的目录结构与文章名灵感来自 极客兔兔

如果文章对你有用,点个赞,就是对我的写作最大的鼓励。

本人技术能力捉襟见肘,如果有写的不对的地方,请留言斧正,十分感谢 🙇

相关实践学习
日志服务之数据清洗与入湖
本教程介绍如何使用日志服务接入NGINX模拟数据,通过数据加工对数据进行清洗并归档至OSS中进行存储。
目录
相关文章
|
7天前
|
Go
go安装三方包并使用
go安装三方包并使用
11 4
|
13天前
|
中间件 Go
go语言后端开发学习(三)——基于validator包实现接口校验
go语言后端开发学习(三)——基于validator包实现接口校验
|
13天前
|
监控 Go
go语言并发实战——日志收集系统(十一)基于etcd来监视配置文件的变化
go语言并发实战——日志收集系统(十一)基于etcd来监视配置文件的变化
|
13天前
|
监控 Go
go语言并发实战——日志收集系统(十) 重构tailfile模块实现同时监控多个日志文件
go语言并发实战——日志收集系统(十) 重构tailfile模块实现同时监控多个日志文件
|
13天前
|
存储 JSON 监控
go语言并发实战——日志收集系统(九) 基于etcd的代码重构思考与初步实现
go语言并发实战——日志收集系统(九) 基于etcd的代码重构思考与初步实现
|
13天前
|
监控 Go
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
|
13天前
|
存储 算法 Go
go语言并发实战——日志收集系统(七) etcd的介绍与简单使用
go语言并发实战——日志收集系统(七) etcd的介绍与简单使用
|
13天前
|
消息中间件 存储 监控
go语言并发实战——日志收集系统(六) 编写日志收集系统客户端
go语言并发实战——日志收集系统(六) 编写日志收集系统客户端
|
1天前
|
IDE Linux Go
记录一个go语言与IDE之间的问题
【7月更文挑战第1天】本文介绍在IDE中调试Go应用可能遇到的问题。当问题与IDE的自动完成有关,可以试着使用其他编辑器如Linux的vim是否无此问题。这可以验证表明IDE可能不完全兼容最新语言版本,建议使用无自动检测工具临时解决。
16 0
|
1天前
|
安全 Go
Go语言的iota关键字有什么用途?
**Go语言中的`iota`是常量生成器,用于在`const`声明中创建递增的常量。`iota`在每个新的`const`块重置为0,然后逐行递增,简化了枚举类型或常量序列的定义。例如,定义星期枚举:** ```markdown ```go type Weekday int const ( Sunday Weekday = iota // 0 Monday // 1 Tuesday // 2 ... ) ``` 同样,`iota`可用于定义不同组的常量,如状态码和标志位,保持各自组内的递增,提高代码可读性。