从0编写一个日志包-《GO开发知识笔记》

admin 2025-11-04 01:30:06 编程 来源:ZONE.CI 全球网 0 阅读模式
  • 介绍
  • 从 0 编写一个日志包

    介绍

    标准库 log 包标准库 log 包的功能非常简单,只提供了 Print、Panic 和 Fatal 三类函数用于日志输出。因为是标准库自带的,所以不需要我们下载安装,使用起来非常方便。标准库 log 包只有不到 400 行的代码量,如果你想研究如何实现一个日志包,阅读标准库 log 包是一个不错的开始。Go 的标准库大量使用了 log 包,例如net/http 、 net/rpc 等。

    glogglog是 Google 推出的日志包,跟标准库 log 包一样,它是一个轻量级的日志包,使用起来简单方便。但 glog 比标准库 log 包提供了更多的功能,它具有如下特性:支持 4 种日志级别:Info、Warning、Error、Fatal。支持命令行选项,例如-alsologtostderr、-log_backtrace_at、-log_dir、-logtostderr、-v等,每个参数实现某种功能。支持根据文件大小切割日志文件。支持日志按级别分类输出。支持 V level。V level 特性可以使开发者自定义日志级别。支持 vmodule。vmodule 可以使开发者对不同的文件使用不同的日志级别。支持 traceLocation。traceLocation 可以打印出指定位置的栈信息。Kubernetes 项目就使用了基于 glog 封装的 klog,作为其日志库。

    logruslogrus是目前 GitHub 上 star 数量最多的日志包,它的优点是功能强大、性能高效、高度灵活,还提供了自定义插件的功能。很多优秀的开源项目,例如 Docker、Prometheus 等,都使用了 logrus。除了具有日志的基本功能外,logrus 还具有如下特性:支持常用的日志级别。logrus 支持 Debug、Info、Warn、Error、Fatal 和 Panic 这些日志级别。可扩展。

    logrus 的 Hook 机制允许使用者通过 Hook 的方式,将日志分发到任意地方,例如本地文件、标准输出、Elasticsearch、Logstash、Kafka 等。支持自定义日志格式。logrus 内置了 JSONFormatter 和 TextFormatter 两种格式。除此之外,logrus 还允许使用者通过实现 Formatter 接口,来自定义日志格式。结构化日志记录。logrus 的 Field 机制允许使用者自定义日志字段,而不是通过冗长的消息来记录日志。预设日志字段。logrus 的 Default Fields 机制,可以给一部分或者全部日志统一添加共同的日志字段,例如给某次 HTTP 请求的所有日志添加 X-Request-ID 字段。Fatal handlers。logrus 允许注册一个或多个 handler,当产生 Fatal 级别的日志时调用。当我们的程序需要优雅关闭时,这个特性会非常有用。zapzap是 uber 开源的日志包,以高性能著称,很多公司的日志包都是基于 zap 改造而来。除了具有日志基本的功能之外,zap 还具有很多强大的特性:支持常用的日志级别,例如:Debug、Info、Warn、Error、DPanic、Panic、Fatal。性能非常高。

    zap 具有非常高的性能,适合对性能要求比较高的场景。支持针对特定的日志级别,输出调用堆栈。像 logrus 一样,zap 也支持结构化的目录日志、预设日志字段,也因为支持 Hook 而具有可扩展性。

    开源日志包选择上面我介绍了很多日志包,每种日志包使用的场景不同,你可以根据自己的需求,结合日志包的特性进行选择:

    标准库 log 包: 标准库 log 包不支持日志级别、日志分割、日志格式等功能,所以在大型项目中很少直接使用,通常用于一些短小的程序,比如用于生成 JWT Token 的 main.go 文件中。标准库日志包也很适合一些简短的代码,用于快速调试和验证。glog: glog 实现了日志包的基本功能,非常适合一些对日志功能要求不多的小型项目。logrus: logrus 功能强大,不仅实现了日志包的基本功能,还有很多高级特性,适合一些大型项目,尤其是需要结构化日志记录的项目。zap: zap 提供了很强大的日志功能,性能高,内存分配次数少,适合对日志性能要求很高的项目。另外,zap 包中的子包 zapcore,提供了很多底层的日志接口,适合用来做二次封装。

    从 0 编写一个日志包

    我会向你展示如何快速编写一个具备基本功能的日志包,让你通过这个简短的日志包实现掌握日志包的核心设计思路。该日志包主要实现以下几个功能:

    支持自定义配置。支持文件名和行号。支持日志级别 Debug、Info、Warn、Error、Panic、Fatal。支持输出到本地文件和标准输出。支持 JSON 和 TEXT 格式的日志输出,支持自定义日志格式。支持选项模式。

    日志包名称为cuslog,示例项目完整代码存放在 cuslog(https://github.com/marmotedu/gopractise-demo/tree/main/log/cuslog)。

    具体实现分为以下四个步骤:

    定义:定义日志级别和日志选项。创建:创建 Logger 及各级别日志打印方法。写入:将日志输出到支持的输出中。自定义:自定义日志输出格式。

    以太坊cppgolang区别 编程

    以太坊cppgolang区别

    以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
    progolang 编程

    progolang

    Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
    golangn个发送者 编程

    golangn个发送者

    Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
    golang技能图谱 编程

    golang技能图谱

    从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
    评论:0   参与:  10