"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)
总而言之,我想在调用“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)