当前位置:首页 > 科技  > 软件

Go 浅析主流日志库:从设计层学习如何集成日志轮转与切割功能

来源: 责编: 时间:2023-11-28 09:32:24 143观看
导读前言在现有的日志库中,包括 go 1.21.0 引入的 slog 日志库,它们通常都支持对日志文件进行轮转与切割,只不过这些功能并不直接被内置,而是需要我们主动配置来启用。本文将探讨几个热门的日志库如 logrus、zap 和官网的 slo

前言

在现有的日志库中,包括 go 1.21.0 引入的 slog 日志库,它们通常都支持对日志文件进行轮转与切割,只不过这些功能并不直接被内置,而是需要我们主动配置来启用。oNf28资讯网——每日最新资讯28at.com

本文将探讨几个热门的日志库如 logrus、zap 和官网的 slog,我将分析这些库的的关键设计元素,探讨它们是如何支持日志轮转与切割功能的配置。oNf28资讯网——每日最新资讯28at.com

准备好了吗?准备一杯你最喜欢的咖啡或茶,随着本文一探究竟吧。oNf28资讯网——每日最新资讯28at.com

前段时间发布了一篇 Go slog 包:开启结构化日志的奇妙之旅 文章,有一位网友问我该日志库是否支持日志轮转与切割功能,此文章也算是解答他的一个疑惑。oNf28资讯网——每日最新资讯28at.com

图片图片oNf28资讯网——每日最新资讯28at.com

浅析 logrus、zap 和 slog 的设计

在对 logrus、zap 和 slog 这几个日志库的设计进行对比分析时,一个显著的共同点是它们都包含了 io.Writer 这个关键的属性。这一属性在日志框架设计中起着核心作用,它决定了日志输出的目标位置。oNf28资讯网——每日最新资讯28at.com

logrus 日志库

logrus 是一个功能丰富的Go语言日志库,它提供了结构化日志记录、日志级别控制等功能。oNf28资讯网——每日最新资讯28at.com

当使用 logrus 时,可以调用 logrus.New() 函数来创建 Logger 实例。通过该实例我们执行很多操作,例如自定义日志输出的位置和打印日志等。我们看看下面的代码:oNf28资讯网——每日最新资讯28at.com

logger := logrus.New()logger.Out = os.Stdout // 标准输出// 或者定向到文件//out, err := os.OpenFile("file.log", os.O_CREATE|os.O_WRONLY, 0666)//if err != nil {//	panic(err)//}//logger.Out = out

Logger 结构体的定义如下所示:oNf28资讯网——每日最新资讯28at.com

type Logger struct {	Out io.Writer	Hooks LevelHooks	Formatter Formatter    // 其他字段...}

关键属性 Out,其类型为 io.Writer,这一属性用于指定日志的输出目标,无论是标准输出、文件,还是其他自定义的输出载体。oNf28资讯网——每日最新资讯28at.com

zap 日志库

zap 是一个性能极高的日志库。它提供了结构化日志记录、多级别日志控制,以及灵活的配置选项。oNf28资讯网——每日最新资讯28at.com

与 logrus 类似,zap 也允许支持通过配置来决定日志输出的位置,但实现方式略有不同。在 zap 中,日志输出是通过配置 zapcore.Core 实现的。在创建 zapcore.Core 实例时,需要指定一个 zapcore.WriteSyncer 接口实现作为参数,这个参数直接决定了日志的输出目标。要创建 zapcore.WriteSyncer 实例,通常使用 zapcore.AddSync() 函数,它接收一个类型为 io.Writer 的参数。oNf28资讯网——每日最新资讯28at.com

下面是一个使用 zap 创建日志实例的基本示例:oNf28资讯网——每日最新资讯28at.com

writer := zapcore.AddSync(os.Stdout) // 使用标准输出作为日志目标core := zapcore.NewCore(    zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),    writer,    zap.InfoLevel,)logger := zap.New(core)defer logger.Sync() // 刷新任何缓冲的日志条目// 使用 logger 进行日志记录

关键在于 zapcore.AddSync() 函数,该函数接收一个类型为 io.Writer 的参数,这一参数用于指定日志的输出目标,无论是标准输出、文件,还是其他自定义的输出载体。oNf28资讯网——每日最新资讯28at.com

slog 日志库

slog 是在 go 1.21.0 版本引入的一个官网日志库,它提供了结构化日志。如果想要更详细地了解 slog 日志库,自荐一篇文章 Go slog 包:开启结构化日志的奇妙之旅。oNf28资讯网——每日最新资讯28at.com

与 logrus 和 zap 类似,slog 也允许用户通过指定 io.Writer 参数来设置日志输出的目标。这一设置是在创建 slog.Handler 接口的实现时进行的。oNf28资讯网——每日最新资讯28at.com

textLogger := slog.New(slog.NewTextHandler(os.Stdout, nil))jsonLogger := slog.New(slog.NewJSONHandler(os.Stdout, nil))

在这两个函数中,slog.NewTextHandler 和 slog.NewJSONHandler 第一个参数的类型都是 io.Writer。oNf28资讯网——每日最新资讯28at.com

浅析总结

在对 logurs、zap 和 slog 这三个主流日志库的分析中,我们可以发现一个关键的共同点:它们在处理日志输出时均依赖于 io.Writer 接口。这些日志库通过将 io.Writer接口作为关键参数的类型,以便设置日志的输出目标。oNf28资讯网——每日最新资讯28at.com

图片图片oNf28资讯网——每日最新资讯28at.com

日志轮转与切割功能的实现机制与实践

实现机制

在浅析了 logurs、zap 和 slog 日志库的设计后,我们发现了它们的共同点。现在,让我们深入了解日志轮转与切割功能的实现机制。oNf28资讯网——每日最新资讯28at.com

为了实现 日志文件的轮转与切割,通常我们会借助第三方库,如 lumberjack,当然还有其他类似的库可供选择,这里就不一一列举了。oNf28资讯网——每日最新资讯28at.com

lumberjack 是一个专门设计用于日志轮转和切割的库,其作用可以类比于一个可插拔的组件。我们可以通过配置该组件,并将其 集成 到所选的日志库中,从而实现日志文件的轮转与切割功能。oNf28资讯网——每日最新资讯28at.com

初始化 lumberjack 组件的代码如下所示:oNf28资讯网——每日最新资讯28at.com

log := &lumberjack.Logger{    Filename:   "/path/file.log", // 日志文件的位置    MaxSize:    10, // 文件最大尺寸(以MB为单位)    MaxBackups: 3, // 保留的最大旧文件数量    MaxAge:     28, // 保留旧文件的最大天数    Compress:   true, // 是否压缩/归档旧文件    LocalTime:  true, // 使用本地时间创建时间戳}

在这个例子中,我们创建了一个 lumberjack.Logger 实例,并设置了以下参数:oNf28资讯网——每日最新资讯28at.com

  • Filename:指定日志文件的存储路径。
  • MaxSize:日志文件达到多少 MB 后进行轮转。
  • MaxBackups:最多保留多少个旧日志文件。
  • MaxAge:旧文件保留的最长时间(天)。
  • Compress:是否压缩旧文件(如转换为.gz)。

需要特别注意的是, lumberjack 的 Logger 结构体实现了 io.Writer 接口。这意味着所有关于日志文件的轮转与切割的核心逻辑都封装在 Write 方法中。这一实现也方便 Logger 结构体被集成到任何支持 io.Writer 参数的日志库中。oNf28资讯网——每日最新资讯28at.com

明白了这些,想必你已经知道如何实现日志轮转与切割的功能了吧。lumberjack 的 logger  结构体实现了 io.Writer 接口,因此将它传递到第三方库中,就能完成集成配置了。oNf28资讯网——每日最新资讯28at.com

实践

logrus 日志库的实现

log := &lumberjack.Logger{    Filename:   "/path/file.log", // 日志文件的位置    MaxSize:    10,               // 文件最大尺寸(以MB为单位)    MaxBackups: 3,                // 保留的最大旧文件数量    MaxAge:     28,               // 保留旧文件的最大天数    Compress:   true,             // 是否压缩/归档旧文件    LocalTime:  true,             // 使用本地时间创建时间戳}logger := logrus.New()logger.Out = log

zap 日志库的实现

log := &lumberjack.Logger{    Filename:   "/path/file.log", // 日志文件的位置    MaxSize:    10,               // 文件最大尺寸(以MB为单位)    MaxBackups: 3,                // 保留的最大旧文件数量    MaxAge:     28,               // 保留旧文件的最大天数    Compress:   true,             // 是否压缩/归档旧文件    LocalTime:  true,             // 使用本地时间创建时间戳}writer := zapcore.AddSync(log)core := zapcore.NewCore(    zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),    writer,    zap.InfoLevel,)logger := zap.New(core)defer logger.Sync() // 刷新任何缓冲的日志条目

slog 日志库的实现

log := &lumberjack.Logger{    Filename:   "/path/file.log", // 日志文件的位置    MaxSize:    10,               // 文件最大尺寸(以MB为单位)    MaxBackups: 3,                // 保留的最大旧文件数量    MaxAge:     28,               // 保留旧文件的最大天数    Compress:   true,             // 是否压缩/归档旧文件    LocalTime:  true,             // 使用本地时间创建时间戳}textLogger := slog.New(slog.NewTextHandler(log, nil))jsonLogger := slog.New(slog.NewJSONHandler(log, nil))

小结

本文对三个热门的日志库 logrus、zap 和 slog 设计要素进行浅析,我们发现虽然它们在创建日志实例的细节上有所差异,但它们共同依赖于 io.Writer 接口参数来处理日志的输出。掌握如何配置 io.Writer 参数,并结合 lumberjack 库的使用,我们就可以实现日志文件的轮转与切割功能。oNf28资讯网——每日最新资讯28at.com

即使后面推出新的日志库,我们也可以通过类似的方法,快速地集成日志文件的轮转与切割功能。oNf28资讯网——每日最新资讯28at.com

本文转载自微信公众号「Go技术干货」,可以通过以下二维码关注。转载本文请联系Go技术干货公众号。oNf28资讯网——每日最新资讯28at.com

oNf28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-34558-0.htmlGo 浅析主流日志库:从设计层学习如何集成日志轮转与切割功能

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 三个中国程序员 vs三个美国程序员,不得不承认,差距太大了!

下一篇: 优雅实现API接口开关:让你的应用更可控

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • 小米平板5 Pro 12.4简评:多专多能 兼顾影音娱乐的大屏利器

    小米平板5 Pro 12.4简评:多专多能 兼顾影音娱乐的大屏利器

    疫情带来了网课,网课盘活了安卓平板,安卓平板市场虽然中途停滞了几年,但好的一点就是停滞的这几年行业又有了新的发展方向,例如超窄边框、高刷新率、多摄镜头组合等,这就让安卓
  • K6:面向开发人员的现代负载测试工具

    K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • JavaScript学习 -AES加密算法

    JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • 19个 JavaScript 单行代码技巧,让你看起来像个专业人士

    19个 JavaScript 单行代码技巧,让你看起来像个专业人士

    今天这篇文章跟大家分享18个JS单行代码,你只需花几分钟时间,即可帮助您了解一些您可能不知道的 JS 知识,如果您已经知道了,就当作复习一下,古人云,温故而知新嘛。现在,我们就开始今
  • JVM优化:实战OutOfMemoryError异常

    JVM优化:实战OutOfMemoryError异常

    一、Java堆溢出堆内存中主要存放对象、数组等,只要不断地创建这些对象,并且保证 GC Roots 到对象之间有可达路径来避免垃 圾收集回收机制清除这些对象,当这些对象所占空间超过
  • 电视息屏休眠仍有网络上传 爱奇艺被质疑“薅消费者羊毛”

    电视息屏休眠仍有网络上传 爱奇艺被质疑“薅消费者羊毛”

    记者丨宁晓敏 见习生丨汗青出品丨鳌头财经(theSankei) 前不久,爱奇艺发布了一份亮眼的一季报,不仅营收和会员营收创造历史最佳表现,其运营利润也连续6个月实现增长。自去年年初
  • 三星Galaxy Z Fold5今日亮相:厚度缩减但仍略显厚重

    三星Galaxy Z Fold5今日亮相:厚度缩减但仍略显厚重

    据官方此前宣布,三星将于7月26日也就是今天在韩国首尔举办Unpacked活动,届时将带来带来包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
  • DRAM存储器10月价格下跌,NAND闪存本月价格与上月持平

    DRAM存储器10月价格下跌,NAND闪存本月价格与上月持平

    10月30日,据韩国媒体消息,自今年年初以来一直在上涨的 DRAM 存储器的交易价格仅在本月就下跌了近 10%,此次是全年首次降价,而NAND 闪存本月价格与上月持平。市
Top