【发布时间】:2019-02-17 01:05:11
【问题描述】:
我想以我自己的格式记录来自 net/http 的错误。在 net/http 包中我找到了Server struct:
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"}}
}
问题:
-
serverJsonWriter方法的主体应该是什么? - 我应该检索
zapio.Writer 以传递log.Logger吗?如何做到这一点?
【问题讨论】:
-
不幸的是,这是不可能的,因为
*log.Logger是一个具体的类型。您可以做的最接近的方法是使用记录到您自己的io.Writer的记录器。 -
有a proposal 可以让log.Logger 成为一个接口,这样会更容易。
-
你想如何将
net/http记录的单个错误信息转换为message和keyAndValues这两个SugaredLogger.Errorw()的参数? -
@icza,我将跳过
keyAndValues。我只想从net/http传递message