Go日志框架是一种用于在Go语言中记录日志的框架。它可以帮助开发人员跟踪应用程序的运行情况,并且可以帮助开发人员在出现问题时更好地定位和解决问题。Go日志框架有很多优点,其中最重要的是它能够帮助开发人员快速定位和解决问题,而不需要手动去检查代码或者使用其他工具来分析问题。
Go日志框架提供了一个标准的API,使得开发人员能够方便地使用它来跟踪应用程序的运行情况。此外,Go日志框架还能够将日志信息存储到文件中,从而方便开发人员对应用程序的运行情况进行分析和监测。此外,Go日志框架还能够将日志信息发送到远程服务器上,从而方便开发人员对应用程序的运行情况进行监测和分析。
package main import ( "log" ) func main() { log.Println("Hello World!") }
Writer
接口是最底层的IO
写入接口,如果业务需要自定义日志内容打印,建议使用Handler
特性。
glog
模块实现了标准输出以及文件输出的日志内容打印。当然,开发者也可以通过自定义io.Writer
接口实现自定义的日志内容输出。io.Writer
是标准库提供的内容输出接口,其定义如下:
type Writer interface {
Write(p []byte) (n int, err error)
}
我们可以通过SetWriter
方法或者链式方法To
来实现自定义Writer
输出,开发者可以在该Writer
中实现定义的操作,也可以在其中整合其他的模块功能。
此外,glog.Logger
对象已经实现了io.Writer
接口,因此开发者可以非常方便地将glog
整合使用到其他的模块中。
在该示例中,我们实现了一个自定义的Writer
对象MyWriter
,在该对象实现的Writer
接口中我们对日志内容进行判断,如果出现了PANI
或者FATA
错误,那么表示是非常严重的错误,该接口将会第一时间通过HTTP
接口告知Monitor
监控服务。随后再将日志内容通过glog
模块按照配置写入到文件和标准输出。
package main
import (
"context"
"fmt"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/os/glog"
"github.com/gogf/gf/v2/text/gregex"
)
type MyWriter struct {
logger *glog.Logger
}
func (w *MyWriter) Write(p []byte) (n int, err error) {
var (
s = string(p)
ctx = context.Background()
)
if gregex.IsMatchString(`PANI|FATA`, s) {
fmt.Println("SERIOUS ISSUE OCCURRED!! I"d better tell monitor in first time!")
g.Client().PostContent(ctx, "http://monitor.mydomain.com", s)
}
return w.logger.Write(p)
}
func main() {
var ctx = context.Background()
glog.SetWriter(&MyWriter{
logger: glog.New(),
})
glog.Fatal(ctx, "FATAL ERROR")
}
执行后,输出结果为:
SERIOUS ISSUE OCCURRED!! I"d better tell monitor in first time!
2019-05-23 20:14:49.374 [FATA] FATAL ERROR
Stack:
1. /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/v2/geg/os/glog/glog_writer_hook.go:27
假如我们需要输出日志到文件及标准输出,并且同时也需要输出日志到Graylog
,很明显这个也是需要自定义Writer
才能实现。当然同理,我们也可以自定义输出到其他的日志收集组件或者数据库中。
Graylog
是与ELK
可以相提并论的一款集中式日志管理方案,支持数据收集、检索、可视化Dashboard
。
示例代码:
package main
import (
"context"
"github.com/gogf/gf/v2/os/glog"
"github.com/robertkowalski/graylog-golang"
)
type MyGrayLogWriter struct {
gelf *gelf.Gelf
logger *glog.Logger
}
func (w *MyGrayLogWriter) Write(p []byte) (n int, err error) {
w.gelf.Send(p)
return w.logger.Write(p)
}
func main() {
var ctx = context.Background()
glog.SetWriter(&MyGrayLogWriter{
logger : glog.New(),
gelf : gelf.New(gelf.Config{
GraylogPort : 80,
GraylogHostname : "graylog-host.com",
Connection : "wan",
MaxChunkSizeWan : 42,
MaxChunkSizeLan : 1337,
}),
})
glog.Println(ctx, "test log")
}
基本介绍如果将之前的示例代码多执行几次之后会发现,返回的结果是没有排序的,而且字段及规则输出的先后顺序完全是随机的。即使...
在对数据进行写入、更新使用诸如Fields/Data/Scan方法时,如果给定的参数为map/struct类型,给定参数的键名/属性名称将...