Versions Compared
compared with
Key
- This line was added.
- This line was removed.
- Formatting was changed.
Tip |
---|
|
自定义Writer
接口
glog
模块实现了标准输出以及文件输出的日志内容打印。当然,开发者也可以通过自定义io.Writer
接口实现自定义的日志内容输出。io.Writer
是标准库提供的内容输出接口,其定义如下:
Code Block | ||
---|---|---|
| ||
type Writer interface { Write(p []byte) (n int, err error) } |
我们可以通过SetWriter
方法或者链式方法To
来实现自定义Writer
输出,开发者可以在该Writer
中实现定义的操作,也可以在其中整合其他的模块功能。
此外,glog.Logger
对象已经实现了io.Writer
接口,因此开发者可以非常方便地将glog
整合使用到其他的模块中。
示例1,实现日志HOOK
在该示例中,我们实现了一个自定义的Writer
对象MyWriter
,在该对象实现的Writer
接口中我们对日志内容进行判断,如果出现了PANI
或者FATA
错误,那么表示是非常严重的错误,该接口将会第一时间通过HTTP
接口告知Monitor
监控服务。随后再将日志内容通过glog
模块按照配置写入到文件和标准输出。
Code Block | ||
---|---|---|
| ||
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") } |
执行后,输出结果为:
Code Block | ||
---|---|---|
| ||
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 |
示例2,整合graylog
假如我们需要输出日志到文件及标准输出,并且同时也需要输出日志到Graylog
,很明显这个也是需要自定义Writer
才能实现。当然同理,我们也可以自定义输出到其他的日志收集组件或者数据库中。
Graylog
是与ELK
可以相提并论的一款集中式日志管理方案,支持数据收集、检索、可视化Dashboard
。
示例代码:
Code Block | ||
---|---|---|
| ||
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") } |
Panel | ||
---|---|---|
| ||
|