当前位置: 首页 > 面试题库 >

net / http设置自定义记录器

阳宗清
2023-03-14
问题内容

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

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

我想用自己的实现代替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. 我应该检索zapio.Writer以便通过它log.Logger吗?这该怎么做?

问题答案:

这很容易log.Logger做到,因为该类型可以保证每个日志消息都可以通过io.Writer一次Writer.Write()调用传递到目标:

每个日志记录操作都会调用Writer的Write方法。一个Logger可以同时从多个goroutine中使用;它保证序列化对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



 类似资料:
  • 我有一个使用slf4j进行日志记录的应用程序。现在我想添加一个功能,每当我记录错误时,就会调用一个特定的url。目前,我在应用程序级别添加了一个包装器方法,该方法发送http请求,然后调用logger方法。但这样我就错过了一些输出,一些异常只是被记录下来,而没有发送相应的请求。我正在尝试创建我的自定义logger类。我的问题是应该扩展哪些类(或要实现的接口)。我无法扩展Logger类,因为它的构造

  • 将PostSharp用于C#应用程序,我有以下场景: Namespace_ACustomLoggingMethod Namespace_B.DoThings thingMethod(实际上是几种不同的方法) DoMomthingMethod调用CustomLoggingMethod,它以所需的格式创建日志条目并且运行良好。正如预期的那样,日志条目将源记录为CustomLoggingMethod,我

  • 问题内容: 我正在尝试使用Go的net / http包设置cookie。我有: 我尝试将“ Golang”与“ cookies”进行谷歌搜索,但没有得到任何好的结果。如果有人能指出我正确的方向,将不胜感激。 问题答案: 我不是Go专家,但是我认为您是在请求中设置Cookie,不是吗?您可能需要在响应上进行设置。net / http中有一个功能。这可能会有所帮助:http : //golang.or

  • 介绍: 现在基于css font-face的字体图标越来越流行。 这种图标具有矢量图的特点,可以不失真的自由缩放,还可以通过css来设置图标的颜色,还有就是网络上资源特别丰富。X5系统自带了数百个字体图标, 用户还可以通过配置使用自己下载的字体图标, 下边就介绍一下具体的使用方法。 首先以fortawesome 网站为例(网址:http://fortawesome.github.io/Font-A

  • 介绍: 现在基于css font-face的字体图标越来越流行。 这种图标具有矢量图的特点,可以不失真的自由缩放,还可以通过css来设置图标的颜色,还有就是网络上资源特别丰富。X5系统自带了数百个字体图标, 用户还可以通过配置使用自己下载的字体图标, 下边就介绍一下具体的使用方法。 首先以fortawesome 网站为例(网址:http://fortawesome.github.io/Font-A

  • 问题内容: 我想实现一个自定义记录器,该记录器将所有日志条目记录到数据库中。目前,我的应用以这种方式记录日志(slf4j和log4j绑定): 我不确定如何进行。我的想法是通过实现org.slf4j.Logger接口来实现自定义日志记录绑定 下一步将是什么?我的目标是不更改当前代码 我考虑过的链接: http://www.slf4j.org/manual.html 问题答案: 它应该相当容易。您需要