"log.Fatal()"执行时如何发送HTTP请求?

How to send HTTP request when "log.Fatal()" is executed?

总而言之,我想在调用“log.Fatal()”时将系统信息发送到我的 HTTP 服务器,而无需为每个日志语句添加任何额外代码。 Changing/overwriting Info、Fatal 等的默认行为会很棒。

在 Python 中,有一种方法可以将 HTTP 处理程序添加到默认日志记录库,该库又会在日志发出时发送 POST HTTP 请求。

您可以为内置 log

创建一个包装器模块

yourproject/log/log.go

package log
import goLog "log"
func Fatal(v ...interface{}) {
   goLog.Fatal(v...)
   // send request ...
   // reqQueue <- some args
}

用项目中的包装器替换 log 模块

// import "log"
import "yourproject/log"

func Foo() {
    log.Fatal(err)
}

尝试创建一个包装标准 Logger 类型的类型,但具有您想要的增强功能。然后通过创建一个名为“log”的实例来包装默认记录器,您可以继续以相同的方式在您的代码中使用日志记录,只需进行最少的更改(因为它将与日志包同名,并保留 *所有的方法)。

package main

import _log "log"

type WrappedLogger struct {
    // This field has no name, so we retain all the Logger methods
    *_log.Logger
}

// here we override the behaviour of log.Fatal
func (l *WrappedLogger) Fatal(v ...interface{}) {
    l.Println("doing the HTTP request")
    /// do HTTP request

    // now call the original Fatal method from the underlying logger
    l.Logger.Fatal(v...)
}

// wrapping the default logger, but adding our new method.
var log = WrappedLogger{_log.Default()}

func main() {
    // notice we can still use Println
    log.Println("hello")
    // but now Fatal does the special behaviour
    log.Fatal("fatal log")
}

*这里唯一的问题是我们用日志 instance 替换了典型的日志 package。在许多方面,它的行为是相同的,因为为了方便起见,日志包中的大部分功能都设置为转发到默认 Logger 实例。

然而,这意味着我们的新 log 将无法访问日志包中的“真实”功能,例如 log.New。为此,您需要引用原始包的别名。

// want to create a new logger?
_log.New(out, prefix, flag)