用 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模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
8天前
|
JSON 中间件 Go
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
本文详细介绍了如何在Go项目中集成并配置Zap日志库。首先通过`go get -u go.uber.org/zap`命令安装Zap,接着展示了`Logger`与`Sugared Logger`两种日志记录器的基本用法。随后深入探讨了Zap的高级配置,包括如何将日志输出至文件、调整时间格式、记录调用者信息以及日志分割等。最后,文章演示了如何在gin框架中集成Zap,通过自定义中间件实现了日志记录和异常恢复功能。通过这些步骤,读者可以掌握Zap在实际项目中的应用与定制方法
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
|
5天前
|
存储 JSON 前端开发
一文搞懂 Go 1.21 的日志标准库 - slog
一文搞懂 Go 1.21 的日志标准库 - slog
16 2
|
12天前
|
中间件 Go 数据库
slog 简介:用于 Go 的结构化日志
slog 简介:用于 Go 的结构化日志
|
12天前
|
编译器 数据库连接 Go
Go Sync 包:并发的 6 个关键概念
Go Sync 包:并发的 6 个关键概念
|
15天前
|
存储 SQL Go
一文弄懂Go语言的Context包,值得收藏!
在开发高效的Go应用程序时,处理超时、取消操作和传递请求范围的数据至关重要。Go标准库中的`context`包提供了一套强大的工具,用于在不同层级间传递取消信号、超时和截止时间等信息。本文首先概述了`context`包的核心功能,接着详细介绍了关键方法,如`WithCancel`、`WithDeadline`、`WithTimeout`和`WithValue`的使用场景。通过创建和派生上下文,开发者能更好地管理请求的生命周期,控制长时间运行的操作,并在并发环境中传递必要的数据。
27 1
|
1月前
|
存储 Go
go语言中fmt格式化包和内置函数汇总
【7月更文挑战第10天】本文介绍fmt包和`Errorf`用于创建格式化的错误消息。`fmt`包还涉及一些接口,如`Formatter`、`GoStringer`、`ScanState`、`Scanner`和`Stringer`,支持自定义格式化和输入/输出处理。
33 1
|
2月前
|
Go
go安装三方包并使用
go安装三方包并使用
27 4
|
2月前
|
中间件 Go
go语言后端开发学习(三)——基于validator包实现接口校验
go语言后端开发学习(三)——基于validator包实现接口校验
|
2月前
|
监控 Go
go语言并发实战——日志收集系统(十一)基于etcd来监视配置文件的变化
go语言并发实战——日志收集系统(十一)基于etcd来监视配置文件的变化
|
2月前
|
监控 Go
go语言并发实战——日志收集系统(十) 重构tailfile模块实现同时监控多个日志文件
go语言并发实战——日志收集系统(十) 重构tailfile模块实现同时监控多个日志文件