日志部分我们使用echo的logger配置和gommon的log,输出到业务项目文件夹log下的interface.log、logging.log、record.log,同时也支持输出到控制台。其中interface.log用于记录接口访问日志,logging.log用于记录代码打点日志,record.log用于记录数据统计日志。go语言自带的log、fmt等只能输出到控制台,并不计入日志。日志写入文件及读写权限使用开源项目lumberjack中的chown.go、chown_linux.go、logger.go(删除其中不相关的代码)。

通过Logtail采集ECS日志日志服务采集到日志后,支持投递到阿里云OSS,再投递到DLA,DLA中建立数据库表映射关系,进行数据统计计算。也支持投递到MaxCompute,关联数据库表进行数据统计计算。暂时没有日志轮询,等有需要可以考虑,阿里云也是支持的

echo、gommon都属于LabStack

1、echo的logger配置。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//设置接口log
interfaceLog := &logrecord.Logger{
       Filename: "log/interface.log",
}
interfaceWriter := io.MultiWriter(os.Stdout, interfaceLog)
e.Use(echomiddleware.LoggerWithConfig(echomiddleware.LoggerConfig{
		Format: `{"time":"${time_rfc3339}","remote_ip":"${remote_ip}","host":"${host}",` +
			`"method":"${method}","uri":"${uri}","post_form":"${post_form}","status":${status},"latency":${latency},` +
			`"latency_human":"${latency_human}","bytes_in":${bytes_in},` +
			`"bytes_out":${bytes_out}}` + "\n",
		Output: apiLogger,
		TagFunc: map[string]func(ctx echo.Context, w io.Writer) (int, error){
			"post_form": func(ctx echo.Context, w io.Writer) (int, error) {
				var postForm string
				req := ctx.Request()
				if req.Header.Get("Content-Type") == "application/x-www-form-urlencoded" {
					if err := req.ParseForm(); err == nil {
						postForm = req.Form.Encode()
					}
				}
				return w.Write([]byte(postForm))
			},
		},
	}))

//设置log
commonLog := &logrecord.Logger{
       Filename: "log/logging.log",
}
commonLogWriter := io.MultiWriter(os.Stdout, commonLog)
log.SetOutput(commonLogWriter)

2、log打印。
调用接口,会自动输入到interface.log文件;logging.log需要各个地方手动打日志或者有错误时自动输入。手动打日志,需要引用gommon的log。数据统计日志,配置一套类似commonLog就可以了,打到record.log。

1
import "github.com/labstack/gommon/log"

3、日志严重程度。
Fatal表示重大错误,Error表示资源或需求得不到满足,Warning表示并不一定是个错误但还是需要引起注意,Info表示不是错误只是一个信息,Debug表示这是给内部开发人员用于调试程序