gpt4 book ai didi

http - net/http 设置自定义记录器

转载 作者:IT王子 更新时间:2023-10-29 02:09:11 28 4
gpt4 key购买 nike

我想以我自己的格式记录来自 net/http 的错误。在 net/http 包中我找到了 Server结构:

type Server struct {
//...
ErrorLog *log.Logger
}

我想用我自己的实现替换记录器:

type AppLogger struct {
log *zap.SugaredLogger
}

func (l *AppLogger) Error(message string, keyAndValues ...interface{}) {
l.log.Errorw(message, keyAndValues...)
}

正确的实现方式是什么?


更新:

我有zap具有以下配置的记录器:

cfg := zap.Config{
Encoding: encoding,
Level: zap.NewAtomicLevelAt(zap.DebugLevel),
OutputPaths: []string{"stdout"},
ErrorOutputPaths: []string{"stdout"},
EncoderConfig: encCfg,
}
logger, err := cfg.Build()

配置成json格式写入。我希望来自 net/http 的错误以与 zap 相同的方式编写。我创建以下内容:

type serverJsonWriter struct {
io.Writer
}

// ListenAndServeTLS - with custom log Writer
func ListenAndServeTLS(addr, certFile, keyFile string, handler http.Handler) error {
server := &http.Server{
Addr: addr,
Handler: handler,
ErrorLog: logger.New(serverJsonWriter{}, "", 0),
}
}

func (w serverJsonWriter) Write(p []byte) (n int, err error){
// {"error":{"type":"net/http error","message":"header too long"}}
}

问题:

  1. serverJsonWriter 方法的主体应该是什么?
  2. 我是否应该检索 zap io.Writer 以便将其传递给 log.Logger?如何做到这一点?

最佳答案

这很容易做到,因为 log.Logger type 保证每条日志消息都被传送到目的地 io.Writer使用单个 Writer.Write() 调用:

Each logging operation makes a single call to the Writer's Write method. A Logger can be used simultaneously from multiple goroutines; it guarantees to serialize access to the Writer.

所以基本上您只需要创建一个实现 io.Writer 的类型,并且其 Write() 方法只是调用您的记录器。

这是一个简单的实现:

type fwdToZapWriter struct {
logger *zap.SugaredLogger
}

func (fw *fwdToZapWriter) Write(p []byte) (n int, err error) {
fw.logger.Errorw(string(p))
return len(p), nil
}

仅此而已。您可以像这样在您的 http.Server 上“安装”此编写器:

server := &http.Server{
Addr: addr,
Handler: handler,
ErrorLog: logger.New(&fwdToZapWriter{logger}, "", 0),
}
上面示例中的

logger 来自您的示例:logger, err := cfg.Build()

如果需要,您可以轻松转发到您的 AppLogger 而不是 logger

查看类似问题:Go: Create io.Writer inteface for logging to mongodb database

关于http - net/http 设置自定义记录器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52294334/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com