【Go开源宝藏】十分强大的日志库 logrus
1. 写在前面
这次 所介绍的库是一个日志库 github.com/sirupsen/logrus ,是我们在web开发中,经常需要的库,因为我们的应用部署到线上出现问题的话,就需要用日志来进行排查。
2. 简单例子
其实日志库用起来是很简单的,就和我们平时使用的 fmt.Println() 是类似的,所以我们只需要将这个
package main import ( log "github.com/sirupsen/logrus" ) func main() { log.WithFields(log.Fields{ "animal": "walrus", }).Info("A walrus appears") }
这样就可以了,我们可以看到就会打印出一条 info 语句了。 同样的,还可以支持 Warn、Error、Fatal 等等…
3. HOOKS
同样的我们也可以直接使用 hooks 去构建我们体系。 比如ELK体系之类的。
加一个钩子就可以形成一套体系了。
下图为例子
日志会异步加载到ES,然后我们可以通过kibana进行快速搜索定位故障
4. 嵌入中间件
-
声明一个 log 对象
var LogrusObj *logrus.Logger
-
初始化日志配置
func init() { if LogrusObj != nil { src, _ := setOutputFile() //设置输出 LogrusObj.Out = src return } //实例化 logger := logrus.New() src, _ := setOutputFile() //设置输出 logger.Out = src //设置日志级别 logger.SetLevel(logrus.DebugLevel) //设置日志格式 logger.SetFormatter(&logrus.TextFormatter{ TimestampFormat: "2006-01-02 15:04:05", }) /* 加个hook形成ELK体系 */ hook := model.EsHookLog() logger.AddHook(hook) LogrusObj = logger }
-
设置输出文件
func setOutputFile() (*os.File, error) { now := time.Now() logFilePath := "" if dir, err := os.Getwd(); err == nil { logFilePath = dir + "/logs/" } _, err := os.Stat(logFilePath) if os.IsNotExist(err) { if err := os.MkdirAll(logFilePath, 0777); err != nil { log.Println(err.Error()) return nil, err } } logFileName := now.Format("2006-01-02") + ".log" //日志文件 fileName := path.Join(logFilePath, logFileName) if _, err := os.Stat(fileName); err != nil { if _, err := os.Create(fileName); err != nil { log.Println(err.Error()) return nil, err } } //写入文件 src, err := os.OpenFile(fileName, os.O_APPEND|os.O_WRONLY, os.ModeAppend) if err != nil { log.Println(err) return nil, err } return src, nil }
-
ES 配置
func EsHookLog() *elogrus.ElasticHook { fmt.Println(EsClient) hook, err := elogrus.NewElasticHook(EsClient, esHost, logrus.DebugLevel, esIndex) fmt.Println("hook", hook) if err != nil { log.Panic(err) } return hook }
-
用法:直接调用
LogrusObj.Infoln(err)
下一篇:
抽象类和接口的区别(最详细)