logrus中输出文件名、行号及函数名
日志中输出文件名,行号及函数名是个比较有用的功能,那么在logrus中如何作到呢?
1. 在自带Formatter中输出
logrus有两个自带的Formatter,分别是:TextFormatter和JSONFormatter。要在这两个Formatter中输出文件名,行号和函数名,只需要设置
logrus.SetReportCaller(true)
1.1 在TextFormatter中输出
func Demo(){
logrus.Info("i'm demo")}func main(){
logrus.SetReportCaller(true)
logrus.SetFormatter(&logrus.TextFormatter{
//以下设置只是为了使输出更美观
DisableColors:true,
TimestampFormat:"2006-01-02 15:03:04",
})Demo()
}//输出
time="2021-05-11 14:02:45" level=info msg="i'm demo" func=main.Demo file="/home/ballqiu/go/log/demo.go:30"
说明:
- func为函数名
- file格式为文件名:行号
- JsonFormatter中的使用类似
func(*runtime.Frame) (function string, file string)
【logrus中输出文件名、行号及函数名】返回值中的function是函数名, file是文件名。
例:
func Demo(){
logrus.Info("i'm demo")}func main(){
logrus.SetReportCaller(true)logrus.SetFormatter(&logrus.JSONFormatter{
TimestampFormat:"2006-01-02 15:03:04",CallerPrettyfier: func(frame *runtime.Frame) (function string, file string) {
//处理文件名
fileName := path.Base(frame.File)
return frame.Function, fileName
},
})Demo()
}//输出
{"file":"demo.go","func":"main.Demo","level":"info","msg":"i'm demo","time":"2021-05-11 14:02:57"}
说明:
- 参数frame中包含了文件名,函数名,行号,等一系列信息。
- path.Base(frame.File)去掉了文件名中的路径部分。
- TextFormatter中的使用与JSONFormatter完全一致
方法:
- 设置logrus.SetReportCaller(true)
- 通过entry.Caller拿到相应的信息进行输出
type MyFormatter struct {}
func (m *MyFormatter) Format(entry *logrus.Entry) ([]byte, error){
var b *bytes.Buffer
if entry.Buffer != nil {
b = entry.Buffer
} else {
b = &bytes.Buffer{}
}timestamp := entry.Time.Format("2006-01-02 15:04:05")
var newLog string//HasCaller()为true才会有调用信息
if entry.HasCaller() {
fName := filepath.Base(entry.Caller.File)
newLog = fmt.Sprintf("[%s] [%s] [%s:%d %s] %s\n",
timestamp, entry.Level, fName, entry.Caller.Line, entry.Caller.Function, entry.Message)
} else{
newLog = fmt.Sprintf("[%s] [%s] %s\n", timestamp, entry.Level, entry.Message)
}b.WriteString(newLog)
return b.Bytes(), nil
}func Demo(){
logrus.Info("i'm demo")
}func main(){
logrus.SetReportCaller(true)logrus.SetFormatter(&MyFormatter{})Demo()
}//输出
[2021-05-11 15:08:46] [info] [demo.go:38 main.Demo] i'm demo
说明:
- entry.Caller.File:文件名
- entry.Caller.Line: 行号
- entry.Caller.Function:函数名
- entry.Caller中还有调用栈相关信息,有需要可以在日志中加入
- entry.HasCaller() 的判断是必须的,否则如果外部没有设置logrus.SetReportCaller(true),entry.Caller.*的调用会引发Panic
推荐阅读
- 热闹中的孤独
- Shell-Bash变量与运算符
- JS中的各种宽高度定义及其应用
- 2021-02-17|2021-02-17 小儿按摩膻中穴-舒缓咳嗽
- 深入理解Go之generate
- 异地恋中,逐渐适应一个人到底意味着什么()
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- “成长”读书社群招募
- 2020-04-07vue中Axios的封装和API接口的管理