用 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日志并进行多维度分析。
目录
相关文章
|
29天前
|
安全 Go
用 Zap 轻松搞定 Go 语言中的结构化日志
在现代应用程序开发中,日志记录至关重要。Go 语言中有许多日志库,而 Zap 因其高性能和灵活性脱颖而出。本文详细介绍如何在 Go 项目中使用 Zap 进行结构化日志记录,并展示如何定制日志输出,满足生产环境需求。通过基础示例、SugaredLogger 的便捷使用以及自定义日志配置,帮助你在实际开发中高效管理日志。
45 1
|
1天前
|
Linux Go iOS开发
怎么禁用 vscode 中点击 go 包名时自动打开浏览器跳转到 pkg.go.dev
本文介绍了如何在 VSCode 中禁用点击 Go 包名时自动打开浏览器跳转到 pkg.go.dev 的功能。通过将 gopls 的 `ui.navigation.importShortcut` 设置为 "Definition",可以实现仅跳转到定义处而不打开链接。具体操作步骤包括:打开设置、搜索 gopls、编辑 settings.json 文件并保存更改,最后重启 VSCode 使设置生效。
18 7
怎么禁用 vscode 中点击 go 包名时自动打开浏览器跳转到 pkg.go.dev
|
16天前
|
Go 索引
go语言使用strings包
go语言使用strings包
23 3
|
1月前
|
编译器 Go 开发者
go语言中导入相关包
【11月更文挑战第1天】
29 3
|
2月前
|
存储 Go 数据库
Go语言Context包源码学习
【10月更文挑战第21天】Go 语言中的 `context` 包用于在函数调用链中传递请求上下文信息,支持请求的取消、超时和截止时间管理。其核心接口 `Context` 定义了 `Deadline`、`Done`、`Err` 和 `Value` 方法,分别用于处理截止时间、取消信号、错误信息和键值对数据。包内提供了 `emptyCtx`、`cancelCtx`、`timerCtx` 和 `valueCtx` 四种实现类型,满足不同场景需求。示例代码展示了如何使用带有超时功能的上下文进行任务管理和取消。
|
2月前
|
缓存 Linux 编译器
【C++】CentOS环境搭建-安装log4cplus日志组件包及报错解决方案
通过上述步骤,您应该能够在CentOS环境中成功安装并使用log4cplus日志组件。面对任何安装或使用过程中出现的问题,仔细检查错误信息,对照提供的解决方案进行调整,通常都能找到合适的解决之道。log4cplus的强大功能将为您的项目提供灵活、高效的日志管理方案,助力软件开发与维护。
64 0
|
3月前
|
存储 Go
Golang语言基于go module方式管理包(package)
这篇文章详细介绍了Golang语言中基于go module方式管理包(package)的方法,包括Go Modules的发展历史、go module的介绍、常用命令和操作步骤,并通过代码示例展示了如何初始化项目、引入第三方包、组织代码结构以及运行测试。
62 3
|
4月前
|
监控 Go 开发者
掌握Go语言中的日志管理
【8月更文挑战第31天】
40 0
|
4月前
|
Go 开发者
|
4月前
|
编译器 Go 开发者