我正在使用Go中的Zap记录器库,并试图实现一种用于日志(log)记录的定制时间戳生成方法.具体地说,我想要use my own time function,而不是依赖system time.

虽然我已经探索了documentation,但我还没有能够准确地找到有效实现自定义时间函数的解决方案.

本质上,我的目标是实现类似于下面的伪代码的功能:

// Sudo code

var tmFn func()time.Time
// more code

logger.SetTimeFunc(tmFn)

如果有任何关于如何在Zap记录器库中实现这种定制的见解或指导,我将不胜感激.

推荐答案

您可以使用WithClock选项来定义您自己的时钟,提供您想要的时间功能.例如使用恒定时钟(总是返回类似2077-01-23T10:15:13Z的日期).这个例子基于zap个库中的clock_test.go个.

package main

import (
    "time"

    "go.uber.org/zap"
    "go.uber.org/zap/zapcore"
)

type constantClock time.Time

func (c constantClock) Now() time.Time { return time.Time(c) }
func (c constantClock) NewTicker(d time.Duration) *time.Ticker {
    return &time.Ticker{}
}

func main() {
    date := time.Date(2077, 1, 23, 10, 15, 13, 441, time.UTC) // clock will always return that date
    clock := constantClock(date)

    config := zap.NewProductionConfig()
    // this is just for sugar, to display a readable date instead of an epoch time
    config.EncoderConfig.EncodeTime = zapcore.TimeEncoderOfLayout(time.RFC3339)

    logger, _ := config.Build()
    logger = logger.WithOptions(zap.WithClock(clock))
    defer logger.Sync()

    logger.Info("Hello")
}

您可以在这里使用该代码:https://go.dev/play/p/8oLQm7mXrlD,它将打印如下:

{"level":"info","ts":"2077-01-23T10:15:13Z","caller":"sandbox1129194476/prog.go:29","msg":"Hello"}

从那里,您可以定制您的时钟根据需要(Now()NewTicker()方法),以提供您将期望的时间.

Go相关问答推荐

gorm如何声明未自动更新的unix时间戳米尔斯字段

try 用GitHub操作中的release标签更新version. go文件,但失败了

消费者在NAT中是如何实现的

带有条件的for循环中缺少RETURN语句

在Golang中Mergesort的递归/并行实现中出现死锁

通过渠道和goroutines增值1000倍

go grpc:无法导入github.com/golang/protobuf/proto(没有所需的模块提供包github.com/gorang/protobuf-proto)

如何在 Chi Router 的受保护路由下提供静态文件(尤其是图像)?

golang testscript .txtar 语法,用于 stderr 或 stdout 中包含的文本

为什么 Go 对于长度为 100k 的切片使用的内存比长度为 100k 的数组要少?

调用库和直接操作效率有区别吗?

使用golang sqlc中的引用参数

下载和合并时输出文件已损坏

为什么 net/http 不遵守超过 30 秒的超时持续时间?

无法使用带有 422 的 go-github 创建提交 - 更新不是快进

使用 unsafe.Pointer 将 struct point直接转换为另一个 struct 是否安全?

级联调用泛型函数时的泛型类型推断

如何在 GORM 中迭代一个 int 数组

如何在 Go 中使用 Pact 返回错误请求(400、500)?

并发 map map导致的 Golang 数据竞争