当前位置: 首页 > news >正文

一文理清GO语言日志库实现开发项目中的日志功能(rotatelogs/zap分析)

一文理清GO语言日志库实现开发项目中的日志功能(rotatelogs/zap分析)

rotatelogs

rotatelogs 是一个用于管理日志文件的 Go 语言库,它提供了自动轮换、压缩和删除旧日志文件的功能。这个库可以帮助你更好地管理和维护你的应用程序日志。要使用 rotatelogs,你需要先安装它:

go get -u github.com/lestrrat-go/file-rotatelogs

package mainimport ("github.com/lestrrat-go/file-rotatelogs""time"
)func main() {logFilePath := ""logFileName := ""// 创建一个日志文件轮换器r, err := rotatelogs.New(logFilePath+logFileName+"./mylog.%Y%m%d", // 日志文件名格式rotatelogs.WithLinkName("./mylog"),       // 软链接名rotatelogs.WithMaxAge(7*24*time.Hour),    // 最大保存时间rotatelogs.WithRotationTime(24*time.Hour), // 轮换间隔)if err != nil {panic(err)}// 使用 r 作为日志输出源logger := log.New(r, "", log.LstdFlags)logger.Println("Hello, rotatelogs!")
}

该示例代码会创建一个名为 mylog.YYYYMMDD 的日志文件,每天轮换一次,并保留最近 7 天的日志文件。你可以根据需要调整这些参数。

“go.uber.org/zap” 和 “go.uber.org/zap/zapcore” 是Go语言中的两个日志库。这两个库提供了高性能、可扩展的日志记录功能。

“go.uber.org/zap”

这个库提供了一个简单的API,用于记录日志。它包含了一些高级功能,如结构化日志记录、日志级别过滤、日志格式化等。要使用这个库,你需要先安装它:

go get -u go.uber.org/zap

然后在你的代码中导入并使用它:

package mainimport ("go.uber.org/zap"
)func main() {logger, err := zap.NewProduction()if err != nil {panic(err)}defer logger.Sync() // flushes buffer, if anylogger.Info("Hello, zap!")
}

下面是一些使用 “go.uber.org/zap” 进行高级日志记录的示例:

  1. 结构化日志记录:

    你可以使用结构体来记录日志,这样可以更方便地添加和删除字段。例如:

type MyLog struct {Time     time.Time `json:"time"`Level    string    `json:"level"`Message  string    `json:"message"`Username string    `json:"username,omitempty"`
}func main() {logger, err := zap.NewProduction()if err != nil {panic(err)}defer logger.Sync() // flushes buffer, if anylog := MyLog{Time:     time.Now(),Level:    "info",Message:  "Hello, zap!",Username: "Alice",}logger.Info("My log", zap.Object("log", log))
}
  1. 日志级别过滤:

    你可以设置不同的日志级别,以便在生产环境中只记录关键信息。例如:

func main() {logger, err := zap.NewDevelopment()if err != nil {panic(err)}defer logger.Sync() // flushes buffer, if anylogger.Debug("Debug message") // 不会输出,因为当前级别是 infologger.Info("Info message")   // 会输出logger.Warn("Warn message")   // 会输出logger.Error("Error message") // 会输出
}
  1. 日志格式化:

    你可以自定义日志的输出格式。例如,你可以使用 JSON 格式输出日志:

func main() {cfg := zap.NewProductionConfig()cfg.Encoding = "json"cfg.OutputPaths = []string{"stdout"}logger, err := cfg.Build()if err != nil {panic(err)}defer logger.Sync() // flushes buffer, if anylogger.Info("Hello, zap!", zap.String("foo", "bar"))
}

这些示例展示了如何使用 “go.uber.org/zap” 进行高级日志记录。你可以根据需要调整配置和使用这些功能。

“go.uber.org/zap/zapcore”

这个库提供了核心的日志记录功能,包括日志级别、日志格式、日志输出等。它是"go.uber.org/zap"库的基础。要使用这个库,你也需要先安装它:

go get -u go.uber.org/zap/zapcore

然后在你的代码中导入并使用它:

package mainimport ("go.uber.org/zap/zapcore"
)func main() {encoderConfig := zapcore.EncoderConfig{TimeKey:        "time",LevelKey:       "level",NameKey:        "logger",CallerKey:      "caller",MessageKey:     "msg",StacktraceKey:  "stacktrace",EncodeLevel:    zapcore.LowercaseLevelEncoder,EncodeTime:     zapcore.ISO8601TimeEncoder,EncodeDuration: zapcore.SecondsDurationEncoder,EncodeCaller:   zapcore.FullCallerEncoder,}
}

“go.uber.org/zap” 库提供了多种高级日志记录功能,以下是一些具体的例子和解释:

1. 结构化日志记录

Zap 支持使用结构体创建结构化的日志条目。例如:

import "go.uber.org/zap"type LogEntry struct {UserID   int       `json:"user_id"`Username string    `json:"username"`Email    string    `json:"email"`Message  string    `json:"message"`Timestamp time.Time `json:"timestamp"`
}func main() {logger, _ := zap.NewProduction()defer logger.Sync() // 确保所有日志都被 flushentry := LogEntry{UserID:   123,Username: "JohnDoe",Email:    "john@example.com",Message:  "User logged in",Timestamp: time.Now(),}logger.Info("User action", zap.Any("entry", entry))
}

在这个例子中,LogEntry 结构体被用来创建一个包含用户操作信息的日志条目。通过使用 zap.Any 将结构体作为任意类型的数据添加到日志中,这允许日志保留其结构格式。

2. 日志级别

Zap 提供不同的日志级别,用于控制日志的详细程度。例如:

import "go.uber.org/zap"func main() {logger, _ := zap.NewDevelopment()defer logger.Sync()logger.Debug("This is a debug message") // 仅在开发环境下可见logger.Info("This is an info message")  // 通常用于生产环境logger.Warn("This is a warning message") // 表示可能的问题logger.Error("This is an error message") // 表示错误logger.Panic("This is a panic message")  // 表示严重错误
}

通过设置不同的日志级别,你可以控制哪些消息应该被记录和注意,这对于不同环境(如开发、测试、生产)中的日志管理非常有用。

3. 日志格式化和输出

Zap 允许你自定义日志的格式化和输出方式。例如,可以将日志以 JSON 格式输出:

import ("go.uber.org/zap""go.uber.org/zap/zapcore"
)func main() {config := zap.NewProductionConfig()config.Encoding = "json"logger, _ := config.Build()defer logger.Sync()logger.Info("Hello, Zap!", zap.String("key", "value"))
}

在这个例子中,日志条目将以 JSON 格式输出,这是通过设置 config.Encoding"json" 实现的。这使得日志具有更好的结构化和可读性,便于日志解析和分析工具处理。

通过这些高级功能,go.uber.org/zap 提供了强大而灵活的日志记录解决方案,适用于各种规模和复杂度的 Go 语言项目。

总之,“go.uber.org/zap” 是一个更高级的日志库,它基于 “go.uber.org/zap/zapcore” 提供了更多的功能。

相关文章:

  • 基于多头注意力机制卷积神经网络结合双向门控单元CNN-BIGRU-Mutilhead-Attention实现柴油机故障诊断附matlab代码
  • MongoDB~高可用集群介绍:复制集群(副本集)、分片集群
  • SQL MAX() 函数深入解析
  • PyQt5设计登录跳转界面
  • 使用net.sf.mpxj读取project的.mpp文件
  • 文件操作(2)(C语言版)
  • Tuple 元组
  • MAX30102驱动
  • 【ajax基础03】常用ajax请求方法和数据提交以及axios错误处理
  • Java23种设计模式(二)
  • MySQL系列-语法说明以及基本操作(二)
  • 力扣爆刷第153天之TOP100五连刷(相交、翻转、排序链表、螺旋矩阵、锯齿二叉树)
  • IPython 使用技巧整理
  • Linux系统之mtr命令的基本使用
  • 超多细节—app图标拖动排序实现详解
  • JavaScript 如何正确处理 Unicode 编码问题!
  • (三)从jvm层面了解线程的启动和停止
  • 4. 路由到控制器 - Laravel从零开始教程
  • ES6语法详解(一)
  • hadoop集群管理系统搭建规划说明
  • OSS Web直传 (文件图片)
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • spark本地环境的搭建到运行第一个spark程序
  • spring boot下thymeleaf全局静态变量配置
  • supervisor 永不挂掉的进程 安装以及使用
  • TypeScript迭代器
  • Vue 重置组件到初始状态
  • Vue2.x学习三:事件处理生命周期钩子
  • 从重复到重用
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 记一次删除Git记录中的大文件的过程
  • 理解在java “”i=i++;”所发生的事情
  • 前嗅ForeSpider教程:创建模板
  • 强力优化Rancher k8s中国区的使用体验
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 设计模式(12)迭代器模式(讲解+应用)
  • python最赚钱的4个方向,你最心动的是哪个?
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • ​学习一下,什么是预包装食品?​
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • $.ajax()方法详解
  • (poj1.3.2)1791(构造法模拟)
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (二)丶RabbitMQ的六大核心
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (顺序)容器的好伴侣 --- 容器适配器
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (一)appium-desktop定位元素原理
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转载)虚函数剖析