用 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日志并进行多维度分析。
目录
相关文章
|
12天前
|
安全 Go
用 Zap 轻松搞定 Go 语言中的结构化日志
在现代应用程序开发中,日志记录至关重要。Go 语言中有许多日志库,而 Zap 因其高性能和灵活性脱颖而出。本文详细介绍如何在 Go 项目中使用 Zap 进行结构化日志记录,并展示如何定制日志输出,满足生产环境需求。通过基础示例、SugaredLogger 的便捷使用以及自定义日志配置,帮助你在实际开发中高效管理日志。
32 1
|
14天前
|
编译器 Go 开发者
go语言中导入相关包
【11月更文挑战第1天】
27 3
|
1月前
|
存储 Go 数据库
Go语言Context包源码学习
【10月更文挑战第21天】Go 语言中的 `context` 包用于在函数调用链中传递请求上下文信息,支持请求的取消、超时和截止时间管理。其核心接口 `Context` 定义了 `Deadline`、`Done`、`Err` 和 `Value` 方法,分别用于处理截止时间、取消信号、错误信息和键值对数据。包内提供了 `emptyCtx`、`cancelCtx`、`timerCtx` 和 `valueCtx` 四种实现类型,满足不同场景需求。示例代码展示了如何使用带有超时功能的上下文进行任务管理和取消。
|
1月前
|
缓存 Linux 编译器
【C++】CentOS环境搭建-安装log4cplus日志组件包及报错解决方案
通过上述步骤,您应该能够在CentOS环境中成功安装并使用log4cplus日志组件。面对任何安装或使用过程中出现的问题,仔细检查错误信息,对照提供的解决方案进行调整,通常都能找到合适的解决之道。log4cplus的强大功能将为您的项目提供灵活、高效的日志管理方案,助力软件开发与维护。
54 0
|
2月前
|
存储 Go
Golang语言基于go module方式管理包(package)
这篇文章详细介绍了Golang语言中基于go module方式管理包(package)的方法,包括Go Modules的发展历史、go module的介绍、常用命令和操作步骤,并通过代码示例展示了如何初始化项目、引入第三方包、组织代码结构以及运行测试。
48 3
|
3月前
|
JSON 中间件 Go
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
本文详细介绍了如何在Go项目中集成并配置Zap日志库。首先通过`go get -u go.uber.org/zap`命令安装Zap,接着展示了`Logger`与`Sugared Logger`两种日志记录器的基本用法。随后深入探讨了Zap的高级配置,包括如何将日志输出至文件、调整时间格式、记录调用者信息以及日志分割等。最后,文章演示了如何在gin框架中集成Zap,通过自定义中间件实现了日志记录和异常恢复功能。通过这些步骤,读者可以掌握Zap在实际项目中的应用与定制方法
135 1
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
|
3月前
|
JavaScript Java API
Java日志通关(二) - Slf4j+Logback 整合及排包
作者日常在与其他同学合作时,经常发现不合理的日志配置以及五花八门的日志记录方式,后续作者打算在团队内做一次Java日志的分享,本文是整理出的系列文章第二篇。
|
3月前
|
存储 JSON 前端开发
一文搞懂 Go 1.21 的日志标准库 - slog
一文搞懂 Go 1.21 的日志标准库 - slog
117 2
|
3月前
|
监控 Go 开发者
掌握Go语言中的日志管理
【8月更文挑战第31天】
34 0
|
3月前
|
Go 开发者
下一篇
无影云桌面