本文主要介绍Golang中最佳日志解决方案,包括常用日志包logrus的基本使用,如何结合file-rotatelogs包实现日志文件的轮转切割两大话题。
Golang关于日志处理有很多包可以使用,标准库提供的日志包功能比较少,不支持日志级别的精确控制,自定义添加日志字段等。在众多的日志包中,更推荐使用第三方的logrus包,完全兼容自带的日志包.logrus是目前Github上星数量最多的日志库,logrus功能强大,性能高效,而且具有高度灵活性,提供了自定义插件的功能。
很多开源项目,如码头工人,普罗米修斯,dejavuzhou/ginbro等,都是用了logrus来记录其日志。
-
<李>完全兼容golang标准库日志模块:logrus拥有六种日志级别:调试信息,警告说,错误,死亡和恐慌,这是golang标准库日志模块的API的超集。李>
<李> logrus。调试(有用的调试信息。)李>
<李> logrus。信息(“值得注意的事情发生了!”)李>
<李> logrus。警告(“你应该看看这个。”)李>
<李> logrus。错误(“事情失败了,但我不会辞职。”)李>
<李> logrus.Fatal(“再见。”)//日志之后会调用os.Exit(1) 李>
<李> logrus。恐慌(“我拯救。”)//日志之后会恐慌()李>
<李>可扩展的钩机制:允许使用者通过钩的方式将日志分发到任意地方,如本地文件系统,标准输出,logstash, elasticsearch或者mq等,或者通过钩定义日志内容和格式等。李>
<李>可选的日志输出格式:logrus内置了两种日志格式,JSONFormatter和定义,如果这两个格式不满足需求,可以自己动手实现接口格式化程序接口来定义自己的日志格式。李>
<李>字段机制:logrus鼓励通过现场机制进行精细化的,结构化的日志记录,而不是通过冗长的消息来记录日志。李>
<李> logrus是一个可插拔的,结构化的日志框架。李>
<李>条目:logrus。WithFields会自动返回一个条目,条目里面的有些变量会被自动加上李>
<李>时间:条目被创建时的时间戳李>
<李>味精:在调用info()等方法时被添加李>
<李>水平,当前日志级别李>
logrus基本使用
主要包 导入( “操作系统” "github.com/sirupsen/logrus” 日志"github.com/sirupsen/logrus” ) var记录器* logrus.Entry func init () {//设置日志格式为json格式 log.SetFormatter(和log.JSONFormatter {}) log.SetOutput (os.Stdout) log.SetLevel (log.InfoLevel) 记录器=log.WithFields(日志。字段{“request_id”:“123444”,“user_ip”:“127.0.0.1”}) } 函数main () { 记录器。信息(“你好,logrus ....”) 记录器。信息(“你好,logrus1 ....”)//log.WithFields (log.Fields {//岸铩?“海象”,//按笮 ?10//})。信息(“一群海象出现的海洋”)//log.WithFields (log.Fields {//皁mg”:没错,//笆俊?122年,//})。警告(“集团的数量大增!”)//log.WithFields (log.Fields {//皁mg”:没错,//笆俊?100年,//})。致命的(“冰了!”) }
很多时候应用会将日志输出到文件系统,对于访问量大的应用来说日志的自动轮转切割管理是个很重要的问题,如果应用不能妥善处理日志管理,那么会带来很多不必要的维护开销:外部工具切割日志,人工清理日志等手段确保不会将磁盘打满。
file-rotatelogs:当你把这个程序,它会自动写入日志,从应用程序中旋转:没有更多的磁盘已满警报因为你忘了设置logrotate !
引用>logrus本身不支持日志轮转切割功能,需要配合file-rotatelogs包来实现,防止日志打满磁盘.file-rotatelogs实现了io。作家接口,并且提供了文件的切割功能,其实例可以作为logrus的目标输出,两者能无缝集成,这也是file-rotatelogs的设计初衷:
正常预期,这个库是使用一些其他的日志服务,比如内置的日志库,或伐木工如github.com/lestrrat-go/apache-logformat。
引用>示例代码:
应用日志文件/用户/开源/测试/走。日志,每隔1分钟轮转一个新文件,保留最近3分钟的日志文件,多余的自动清理掉。
主要包 导入( “时间” rotatelogs "github.com/lestrrat-go/file-rotatelogs” 日志"github.com/sirupsen/logrus” ) func init () { 路径:="/用户/开源/测试/go.log”/*日志轮转相关函数 “WithLinkName”为最新的日志建立软连接 “WithRotationTime”设置日志分割的时间,隔多久分割一次 WithMaxAge和WithRotationCount二者只能设置一个 “WithMaxAge”设置文件清理前的最长保存时间 “WithRotationCount”设置文件清理前最多保存的个数 *///下面配置日志每隔1分钟轮转一个新文件,保留最近3分钟的日志文件,多余的自动清理掉。 作家,_:=rotatelogs.New ( 路径+”。Y % % m % d % H % m”, rotatelogs.WithLinkName(路径), rotatelogs.WithMaxAge (time.Duration (180) * time.Second), rotatelogs.WithRotationTime (time.Duration (60) * time.Second), ) log.SetOutput(作家)//log.SetFormatter(和log.JSONFormatter {}) } 函数main () { 为{ 日志。信息(“hello, world !”) time . sleep (time.Duration (2) * time.Second) } }Golang logrus日志包及日志切割的实现