golang 集成logrus日志框架

1、安装

go get github.com/sirupsen/logrus

实现日志滚动

go get gopkg.in/natefinch/lumberjack.v2

2、初始化logrus参数


var Logger = logrus.New()

func SetLogrus(logConf conf.LogConfig) {
	Logger.SetLevel(GetLevel(logConf.Level))
	Logger.SetReportCaller(true)
	Logger.SetFormatter(&logrus.JSONFormatter{
		TimestampFormat: constants.DateTimeMillLayout,
		CallerPrettyfier: func(frame *runtime.Frame) (function string, file string) {
			fileName := path.Base(frame.File)
			lineNum := strconv.Itoa(frame.Line)
			return "", fileName + ":" + lineNum
		},
	})
    // 使用 lumberjack 实现 logrus 的滚动日志
	logger := &lumberjack.Logger{
		Filename:   logConf.Path,
		MaxSize:    300,   // 日志文件大小,单位是 MB
		MaxBackups: 30,    // 最大过期日志保留个数
		MaxAge:     30,    // 保留过期文件最大时间,单位 天
		Compress:   false, // 是否压缩日志,默认是不压缩,这里设置为true,压缩日志
	}
	Logger.SetOutput(logger)

}

func GetLogger() *logrus.Logger {
	return Logger
}

func GetLevel(levelStr string) logrus.Level {
	switch levelStr {
	case "trace":
		return logrus.TraceLevel
	case "debug":
		return logrus.DebugLevel
	case "info":
		return logrus.InfoLevel
	case "warn":
		return logrus.WarnLevel
	case "error":
		return logrus.ErrorLevel
	case "fatal":
		return logrus.FatalLevel
	case "panic":
		return logrus.PanicLevel
	default:
		return logrus.InfoLevel
	}
}

问题点:若要对logrus进行包装,会存在输出的文件和行号错误,解决方案:

func Infof(msg string, args ...interface{}) {
	entry := logrus.NewEntry(Logger) // work!
	entry.Data["file:line"] = fileInfo(2)
	entry.Infof(msg, args...)
}

func fileInfo(skip int) string {
	_, file, line, ok := runtime.Caller(skip)
	if !ok {
		file = ""
		line = 1
	} else {
		slash := strings.LastIndex(file, "/")
		if slash >= 0 {
			file = file[slash+1:]
		}
	}
	return fmt.Sprintf("%s:%d", file, line)
}

使用示例:

// 推荐使用
logrus.WithFields(logrus.Fields{
    "name": "张三",
    "age": 20,
  }).Info("my msg")

// 支持
logrus.Infof("to %s, do %s", "xxx", "yyyy")

你可能感兴趣的:(golang,开发语言,后端)