golog 与 juju/errors 在 go iris 项目中的实践

本文介绍,或者说是推荐两个简单易用的有关日志与异常的记录包,日志与异常是对难舍难分的难兄难弟,本人在 go iris 实践中也换了好几次日志包了,最后选择这两个包。
 

kataras/golog


go get github.com/kataras/golog
golog 提供5个级别的日志,info,warn,error,debug,fatal,与其他日志框架没什么区别,但是它更易使用,扩充。
  1. 彩色显示不同级别日志
  2. 支持多种日志同时输出,比如控制台输出、文件输出
  3. 自定义格式输出
  4. 自定义日志级别,比如添加一个disable,就变成了disable,info,warn,error,debug,fatal
  5. child 日志,可以输出多个想关联的日志
  6. 与其他第三方日志集成,比如 logrus
 
 使用时你可以不用初始化任何对象,全部用内部默认的初始化,本网站(爱斯园)就全部使用默认的初始化。
golog.Println("This is a raw message, no levels, no colors.")
golog.Info("This is an info message, with colors (if the output is terminal)")
golog.Warn("This is a warning message")
golog.Error("This is an error message")
golog.Debug("This is a debug message")
golog.Fatal("Fatal will exit no matter what, but it will also print the log message if logger's Level is >=FatalLevel")
你也可以对其进行一些初始化,假如你要将日志写入本地文件,那么初始化就是必须了,但是也非常简单
package main

import (
"os"
"time"

"github.com/kataras/golog"
)

func main() {
   f := newLogFile()
   defer f.Close()

   golog.AddOutput(f)

   golog.Println("This is a raw message, no levels, no colors.")
   golog.Info("This is an info message, without colors because one of the Outputs is not a terminal-based")
   golog.Warn("This is a warning message")
   golog.Error("This is an error message")
}

// get a filename based on the date, file logs works that way the most times
// but these are just a sugar.
func todayFilename() string {
   today := time.Now().Format("Jan 02 2006")
   return today + ".txt"
}

func newLogFile() *os.File {
   filename := todayFilename()
   // open an output file, this will append to the today's file if server restarted.
   f, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
   if err != nil {
      panic(err)
   }

   return f
}

 

juju/errors


go get github.com/juju/errors
可以这么说,没写10行代码,就有一行是处理异常,golang处理异常更是多如牛毛,监控记录异常,对我们优化系统,修复bugs至关重要。juju/errors 是一个非常优秀的异常处理框架。
  1. 异常追踪,并记录事发现场,func Trace(other error) error
  2. 包装异常,添加额外信息,func Wrap(other, newDescriptive error) error
  3. 已经封装好的函数,func UserNotFoundf(format string, args ...interface{}) error
  4. 还可以自定义异常结构体,比如加上自定义的异常码,标注不同异常
  5. 将日志按包装的层级输出,func ErrorStack(err error) string
if err != nil {
   return nil, errors.Trace(err)
}
。。。
errors.ErrorStack(err)
本网站也就仅仅用了这个框架的两个方法,Trace,ErrorStack,跟踪错误日志,然后按层级输出,我就可以定位是哪个文件,哪行代码异常,我从服务器上截图日志,可以看到不同级别错误颜色不同,错误发生的地方,以及错误发生在哪个请求。

 

两者结合


func WriteErrorLog(ctx iris.Context, err error) bool {
   if err != nil {
      golog.Errorf("%s, url = %s", errors.ErrorStack(err), ctx.Path())
      return true
   } else {
      return false
   }
}
上面是我项目中封装的一个方法,将golog,juju/errors 结合使用,web 框架用的是 go iris。
Posted by 何敏 on 2020-02-14 09:49:02