golang开发者常用的日志三方库Logrus;具备兼容性、扩展性等多种优点;本篇博客结合源码来分析它的设计思路和更高级的使用方法;
基础介绍
官方给到的介绍 Logrus 是 Go (golang) 的结构化记录器,与标准库记录器完全 API 兼容。
包含三大组成部分:日志等级、打印信息、输出样式;
日志等级
日志等级从低到高(Panic、、Error、Warn、Info、Debug、Trace)
在exported.go
中实现了一个标准logger对象std
;其默认的日志记录等级是Info
,只有当打印等级低于日志记录等级才会进行输出(祥见export.go
中IsLevelEnabled
方法);
1 | var ( |
1 | // It's recommended to make this a global instance called `log`. |
1 | // IsLevelEnabled checks if the log level of the logger is greater than the level param |
Entry和Logger两者的关系
Entry和Logger是整个Logrus库中最重要的两个数据结构;了解了这两者的关系你就能更清楚的知道Logrus的整个设计思路;
- Logger是一个全局日志工具,所有记录日志的上层操作接口是由Logger提供,Entry属于单条日志记录的实体,Logger每打印一条日志,都对应创建一个Entry对象,并最后交由它处理;
- Entry是每条日志记录的实体,每记录一条日志,都会创建一个Entry对象,里面包含具体日志记录的数据字段和方法集;
exported中常用方法
exported.go
中实现了一个标准的logger对象,并提供基础方法;
SetReportCaller
SetReportCaller(true)
方法其功能就是输出日志中添加文件名和方法信息;logger对象中有ReportCaller
字段,用于是否记录调用者信息的标志,默认为false;Entry对象会根据这个标志创建Caller,Caller是runtime.Frame
类型,可以检索第一个非 Logrus 调用函数的名称和包名;
SetOutput
SetOutput()
方法可重定向日志输出到文件等;
1 | // SetOutput sets the standard logger output. |
SetFormatter
SetFormatter()
可通过实现Formatter
接口重新定义日志输出格式;Logrus已经实现了JSONFormatter
和TextFormatter
两种输出样式;也可以自己实现接口自定义输出样式;
1 | type Formatter interface { |
1 | // SetFormatter sets the standard logger formatter. |
AddHook
Logrus可以通过添加钩子的方式来实现每条日志输出前都会执行钩子的特定方法;
1 | // AddHook adds a hook to the standard logger hooks. |
通过实现Hook接口创建钩子,添加钩子对象会在entry的log方法中执行钩子方法fire();从注释可以知道钩子方法的执行和日志等级应该,同时钩子方法并不会开辟goroutine进行执行;
1 | //A hook to be fired when logging on the logging levels returned from |
第三方Hook
将日志发送到 缓冲或队列 等中间件中:
mgorus:将日志发送到 mongodb;
logrus-redis-hook:将日志发送到 redis;
logrus-amqp:将日志发送到 ActiveMQ;
最后
Logger是可以高度定制的,使用Hook钩子机制,Formatter定义日志格式,可以做到多级别输出、格式化输出、多样化输出。你学费了吗?