Golang logrus 日志包及日志切割的实现
本文主要介绍Golang中最佳日志解决方案,包括常用日志包logrus的基本使用,如何结合file-rotatelogs包实现日志文件的轮转切割两大话题。
Golang关于日志处理有很多包可以使用,标准库提供的log包功能比较少,不支持日志级别的精确控制,自定义添加日志字段等。在众多的日志包中,更推荐使用第三方的logrus包,完全兼容自带的log包。logrus是目前Github上star数量最多的日志库,logrus功能强大,性能高效,而且具有高度灵活性,提供了自定义插件的功能。
很多开源项目,如docker,prometheus,dejavuzhou/ginbro等,都是用了logrus来记录其日志。
logrus特性
- 完全兼容golang标准库日志模块:logrus拥有六种日志级别:debug、info、warn、error、fatal和panic,这是golang标准库日志模块的API的超集。
- logrus.Debug(“Usefuldebugginginformation.”)
- logrus.Info(“Somethingnoteworthyhappened!”)
- logrus.Warn(“Youshouldprobablytakealookatthis.”)
- logrus.Error(“SomethingfailedbutI'mnotquitting.”)
- logrus.Fatal(“Bye.”)//log之后会调用os.Exit(1)
- logrus.Panic(“I'mbailing.”)//log之后会panic()
- 可扩展的Hook机制:允许使用者通过hook的方式将日志分发到任意地方,如本地文件系统、标准输出、logstash、elasticsearch或者mq等,或者通过hook定义日志内容和格式等。
- 可选的日志输出格式:logrus内置了两种日志格式,JSONFormatter和TextFormatter,如果这两个格式不满足需求,可以自己动手实现接口Formatter接口来定义自己的日志格式。
- Field机制:logrus鼓励通过Field机制进行精细化的、结构化的日志记录,而不是通过冗长的消息来记录日志。
- logrus是一个可插拔的、结构化的日志框架。
- Entry:logrus.WithFields会自动返回一个*Entry,Entry里面的有些变量会被自动加上
- time:entry被创建时的时间戳
- msg:在调用.Info()等方法时被添加
- level,当前日志级别
logrus基本使用
packagemain
import(
"os"
"github.com/sirupsen/logrus"
log"github.com/sirupsen/logrus"
)
varlogger*logrus.Entry
funcinit(){
//设置日志格式为json格式
log.SetFormatter(&log.JSONFormatter{})
log.SetOutput(os.Stdout)
log.SetLevel(log.InfoLevel)
logger=log.WithFields(log.Fields{"request_id":"123444","user_ip":"127.0.0.1"})
}
funcmain(){
logger.Info("hello,logrus....")
logger.Info("hello,logrus1....")
//log.WithFields(log.Fields{
//"animal":"walrus",
//"size":10,
//}).Info("Agroupofwalrusemergesfromtheocean")
//log.WithFields(log.Fields{
//"omg":true,
//"number":122,
//}).Warn("Thegroup'snumberincreasedtremendously!")
//log.WithFields(log.Fields{
//"omg":true,
//"number":100,
//}).Fatal("Theicebreaks!")
}
基于logrus和file-rotatelogs包实现日志切割
很多时候应用会将日志输出到文件系统,对于访问量大的应用来说日志的自动轮转切割管理是个很重要的问题,如果应用不能妥善处理日志管理,那么会带来很多不必要的维护开销:外部工具切割日志、人工清理日志等手段确保不会将磁盘打满。
file-rotatelogs:Whenyouintegratethistotoyouapp,itautomaticallywritetologsthatarerotatedfromwithintheapp:Nomoredisk-fullalertsbecauseyouforgottosetuplogrotate!
logrus本身不支持日志轮转切割功能,需要配合file-rotatelogs包来实现,防止日志打满磁盘。file-rotatelogs实现了io.Writer接口,并且提供了文件的切割功能,其实例可以作为logrus的目标输出,两者能无缝集成,这也是file-rotatelogs的设计初衷:
It'snormallyexpectedthatthislibraryisusedwithsomeotherloggingservice,suchasthebuilt-inloglibrary,orloggerssuchasgithub.com/lestrrat-go/apache-logformat.
示例代码:
应用日志文件/Users/opensource/test/go.log,每隔1分钟轮转一个新文件,保留最近3分钟的日志文件,多余的自动清理掉。
packagemain
import(
"time"
rotatelogs"github.com/lestrrat-go/file-rotatelogs"
log"github.com/sirupsen/logrus"
)
funcinit(){
path:="/Users/opensource/test/go.log"
/*日志轮转相关函数
`WithLinkName`为最新的日志建立软连接
`WithRotationTime`设置日志分割的时间,隔多久分割一次
WithMaxAge和WithRotationCount二者只能设置一个
`WithMaxAge`设置文件清理前的最长保存时间
`WithRotationCount`设置文件清理前最多保存的个数
*/
//下面配置日志每隔1分钟轮转一个新文件,保留最近3分钟的日志文件,多余的自动清理掉。
writer,_:=rotatelogs.New(
path+".%Y%m%d%H%M",
rotatelogs.WithLinkName(path),
rotatelogs.WithMaxAge(time.Duration(180)*time.Second),
rotatelogs.WithRotationTime(time.Duration(60)*time.Second),
)
log.SetOutput(writer)
//log.SetFormatter(&log.JSONFormatter{})
}
funcmain(){
for{
log.Info("hello,world!")
time.Sleep(time.Duration(2)*time.Second)
}
}
Golang标准日志库log使用
虽然Golang标准日志库功能少,但是可以选择性的了解下,下面为基本使用的代码示例,比较简单:
packagemain
import(
"fmt"
"log"
)
funcinit(){
log.SetPrefix("【UserCenter】")//设置每行日志的前缀
log.SetFlags(log.LstdFlags|log.Lshortfile|log.LUTC)//设置日志的抬头字段
}
funcmain(){
log.Println("log...")
log.Fatalln("FatalError...")
fmt.Println("Notprint!")
}
自定义日志输出
packagemain
import(
"io"
"log"
"os"
)
var(
Info*log.Logger
Warning*log.Logger
Error*log.Logger
)
funcinit(){
errFile,err:=os.OpenFile("errors.log",os.O_CREATE|os.O_WRONLY|os.O_APPEND,0666)
iferr!=nil{
log.Fatalln("打开日志文件失败:",err)
}
Info=log.New(os.Stdout,"Info:",log.Ldate|log.Ltime|log.Lshortfile)
Warning=log.New(os.Stdout,"Warning:",log.Ldate|log.Ltime|log.Lshortfile)
Error=log.New(io.MultiWriter(os.Stderr,errFile),"Error:",log.Ldate|log.Ltime|log.Lshortfile)
}
funcmain(){
Info.Println("Infolog...")
Warning.Printf("Warninglog...")
Error.Println("Errorlog...")
}
相关文档
https://mojotv.cn/2018/12/27/golang-logrus-tutorial
https://github.com/lestrrat-go/file-rotatelogs
https://www.flysnow.org/2017/05/06/go-in-action-go-log.html
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。