当前位置: 首页 > article >正文

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")


http://www.kler.cn/a/152091.html

相关文章:

  • 微服务实战系列之Nginx(技巧篇)
  • AI落地现状:没有mission、业务零碎、连2B还是2C都在摇摆
  • 制造企业建设数字工厂管理系统的难点主要有哪些
  • qt 5.15.2 的编译部署quazip-0.7.3项目过程
  • JSP+servlet实现高校社团管理系统
  • Intellij IDEA 的安装和使用以及配置
  • 免费WordPress站群插件-批量管理站群的免费软件
  • Redis核心数据结构
  • LSTM seq2seq 模型之英语到法语翻译
  • 网络套接字
  • Vue模块与小程序生命周期
  • pyrosetta学习相关(1)
  • 大数据分析与应用实验任务十
  • Android 滑动按钮(开关) SwitchCompat 自定义风格
  • Linux环境配置Seata开机自启脚本(在MySQL和Nacos启动后启动)
  • mysql中删除数据后,新增数据时id会跳跃,主键自增id不连续
  • 代码随想录算法训练营第三十八天| 509 斐波那契数 70 爬楼梯 746 使用最小花费爬楼梯
  • Windows10中在Visual Studio2017中VC++项目安装使用GoogleTest库
  • 什么是数据分析
  • Python的正则表达式使用