温文尔雅的火龙果 · import cv2 # ...· 3 月前 · |
俊秀的熊猫 · C语言字符串操作总结大全(超详细)-腾讯云开 ...· 1 年前 · |
腼腆的香槟 · Microsoft Learn: ...· 1 年前 · |
被表白的茶叶 · Spring中采用公共变量并发问题解决-阿里 ...· 1 年前 · |
彷徨的匕首 · java - Why does ...· 1 年前 · |
日志中输出文件名,行号及函数名是个比较有用的功能,那么在logrus中如何作到呢?
logrus有两个片自的Formatter,分别是:TextFormatter和JSONFormatter。(如果不了解TextFormatter和JSONFormatter,可以 点这里 )要在这两个Formatter中输出文件名,行号和函数名,只需要设置
logrus.SetReportCaller(true)
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"
说明:
上例中的文件名因为包含了路径信息,因此特别长。如果我们只要想文件名,不想输出路径,以便使得日志更简短,怎么做呢?可以设置Formatter中的CallerPrettyfier,它的函数原型是:
func(*runtime.Frame) (function string, file string)
返回值中的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"}
说明:
如果你还不了解如何自定义Formatter,可以参看 logrus自定义日志输出格式 。
方法:
例:
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
说明: