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

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

时间:2024-06-18 19:57:34浏览次数:24  
标签:uber rotatelogs go GO org 日志 logger zap

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

rotatelogs

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

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

package main

import (
	"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 main

import (
	"go.uber.org/zap"
)

func main() {
	logger, err := zap.NewProduction()
	if err != nil {
		panic(err)
	}
	defer logger.Sync() // flushes buffer, if any
	logger.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 any

	log := 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 any

	logger.Debug("Debug message") // 不会输出,因为当前级别是 info
	logger.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 any

	logger.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 main

import (
	"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() // 确保所有日志都被 flush

    entry := LogEntry{
        UserID:   123,
        Username: "JohnDoe",
        Email:    "[email protected]",
        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” 提供了更多的功能。

标签:uber,rotatelogs,go,GO,org,日志,logger,zap
From: https://blog.csdn.net/weixin_43786143/article/details/139781966

相关文章

  • Django框架入门必会三板斧,Django静态文件 static,Django有两种静态文件, Django框架
    ⅠDjango框架入门必会三板斧【一】Django项目如何添加新功能启动django项目之后如何添加更多的功能回想自己编写的web框架如果要添加功能就去urls.py和views.py【1】添加URL映射在项目的urls.py文件中,通过导入相应的应用(app)及其视图函数,并使用path()或include()......
  • Golang与设计模式
    单例模式因为之前研究Java比较多,所以当我试着使用go来实现一些设计模式的时候,首先想到的就是照搬Java中的思路,后面对go了解加深之后又增加了一些新的思路。在Java中实现的单例模式的思路有很多,但是比较好的两个思路是利用类加载机制生成单例对象,check-lock-check机制避免并发问......
  • Dozzle-解决通过命令方式查看Docker 日志的神器
    对于程序员们来说,Docker一定是不陌生了。Docker为我们的工作带来的巨大的便利,你可以使用它快速部署和扩展应用程序,并保证隔离性和可移植性,使应用程序在容器内独立运行,而且可以轻松地在不同的主机和操作系统上移植。Docker还简化了开发环境的配置和协作,开发人员可以使用相同的容......
  • 查看mongo的bson数据文件
    转载请注明出处:BSON(BinarySerializedDocumentFormat)是MongoDB中用于存储和传输数据的一种二进制形式的存储格式,它基于JSON格式,但比JSON更松散,支持更多的数据类型。MongoDB使用BSON作为其文档的存储格式,这意味着当驱动程序使用文档进行插入、查询或其他操作时,会先将文档编......
  • DolphinScheduler日志乱码、worker日志太多磁盘报警、版本更新导致不兼容怎么办?
    作者|刘宇星本文作者总结了在使用ApacheDolphinScheduler过程中遇见过的常见问题及其解决方案,包括日志出现乱码、worker日志太多磁盘报警、版本更新导致不兼容问题等,快来看看有没有困扰你想要的答案吧!DolphinScheduler集群环境有多台worker(worker1,worker2,worker3),多个......
  • go使用opentelemetry+jaeger---grpc
    clientpackagemainimport( "context" "fmt" "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.op......
  • go使用opentelemetry+jaeger---gin+gprc
    api-1packagemainimport( "context" "fmt" "github.com/gin-gonic/gin" "go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin" "go.opentelemetry.io/otel" "go.opentelemetr......
  • MongoDB 的集群架构与设计
    本文涉及的产品云数据库MongoDB,通用型2核4GB推荐场景:五天玩转MongoDB训练营  简介:MongoDB的集群架构与设计一、前言MongoDB有三种集群架构模式,分别为主从复制(Master-Slaver)、副本集(ReplicaSet)和分片(Sharding)模式。Master-Slaver是一种......
  • 基于google f1的schema-change
    异步schema变更为什么在分布式系统中异步变更schema比较困难F1中的schema变更是在线的、异步的,schema变更的过程中所有数据保持可用,保持数据一致性,并最大限度的减小对性能的影响。最大的难点在于所有F1服务器的schema变更是无法同步的,也就是说不同的F1服务器会在......
  • Google 新 AI 为视频生成配乐和对白;Runway 发布 Gen-3 视频生成模型丨 RTE 开发者日报
      开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观点,......