首页 > 其他分享 >[golang]使用logrus自定义日志模块

[golang]使用logrus自定义日志模块

时间:2023-04-10 22:56:19浏览次数:48  
标签:... log 自定义 logrus golang func logger 日志

简介

logrus是一个第三方日志库,性能虽不如zapzerolog,但方便易用灵活。logrus完全兼容标准的log库,还支持文本、JSON两种日志输出格式。

特点

  • 相较于标准库,logrus有更细致的日志级别,从高到低分别是:trace > debug > info > warn > error > fatal > panic
  • 支持自定义日志格式,内置支持JSON格式。
  • 支持可扩展的 Hooks 机制,可以为不同级别的日志添加 Hooks 将日志记录到不同位置。
  • 并发安全。

安装

go get github.com/sirupsen/logrus

快速入门

package main

import (
	"github.com/sirupsen/logrus"
)

func main() {
	logrus.SetLevel(logrus.TraceLevel)  // 默认为info日志级别

	logrus.Trace("trace log")
	logrus.Debug("debug log")
	logrus.Info("Info log")
	logrus.Warn("warn log")
	logrus.Error("error log")
	logrus.Panic("panic log") // panic会输出报错然后终止程序
	logrus.Fatal("fatal log")   // fatal会直接终止程序
}

自定义log模块

需求:自定义日志模块,实现日志文件自动分割,同时向控制台和文件输出日志。

示例代码:

  • tmpgo/pkg/log/log
package log

import (
	"os"
	"path/filepath"

	"github.com/orandin/lumberjackrus"
	"github.com/sirupsen/logrus"
)

var logger *logrus.Logger
var logDirPath string = "logs"
var logFilePath string

func init() {
	// logs目录是否存在, 不存在则创建
	if _,err := os.Stat(logDirPath); os.IsNotExist(err) {
		os.MkdirAll(logDirPath, os.ModePerm)
	}

	logFilePath = filepath.Join(logDirPath, "app.log")

	logger = logrus.New()
	logger.SetOutput(os.Stdout)    // 在标准输出中显示日志内容
	logger.SetLevel(logrus.InfoLevel)    // 标准输出中的日志级别
	logger.SetFormatter(&logrus.JSONFormatter{    // 标准输出以json形式显示日志
		TimestampFormat: "2006-01-02 15:04:05.000",
	})

	logger.AddHook(rotateHook())    // 通过添加hook的方式实现日志输出到文件中并自动切割

}

// 日志文件自动切割
func rotateHook() logrus.Hook {
	hook, err := lumberjackrus.NewHook(&lumberjackrus.LogFile{
		Filename:   logFilePath,
		MaxAge:     1,
		MaxSize:    100,
		MaxBackups: 30,
		Compress:   true,
		LocalTime:  false,
	},
		logrus.InfoLevel,
		&logrus.JSONFormatter{TimestampFormat: "2006-01-02 15:04:05.000"},
		&lumberjackrus.LogFileOpts{})
	if err != nil {
		logrus.Fatal(err)
	}

	return hook
}

func Info(v ...interface{}) {
	logger.Info(v)
}

func Infof(format string, v ...interface{}) {
	logger.Infof(format, v...)
}

func Warn(v ...interface{}) {
	logger.Warn(v)
}

func Warnf(format string, v ...interface{}) {
	logger.Warnf(format, v...)
}

func Debug(v ...interface{}) {
	logger.Debug(v)
}

func Debugf(format string, v ...interface{}) {
	logger.Debugf(format, v...)
}

func Error(v ...interface{}) {
	logger.Error(v)
}

func Errorf(format string, v ...interface{}) {
	logger.Errorf(format, v...)
}

func Panic(v ...interface{}) {
	logger.Panic(v)
}

func Panicf(format string, v ...interface{}) {
	logger.Panicf(format, v...)
}

func Fatal(v ...interface{}) {
	logger.Fatal(v)
}

func Fatalf(format string, v ...interface{}) {
	logger.Fatalf(format, v...)
}
  • main.go中使用
package main

import (
	"tmpgo/pkg/log"
)

func main() {
	log.Debug("debug log")
	log.Info("Info log")
	log.Warn("warn log")
	log.Error("error log")
}

参考

标签:...,log,自定义,logrus,golang,func,logger,日志
From: https://www.cnblogs.com/XY-Heruo/p/customizeLogModulByLogrus.html

相关文章

  • Context响应,重定向,自定义函数,Abort
    前言:Context对象提供了很多内置的响应形式,JSON、HTML、Protobuf、MsgPack、Yaml、String等。它会为每一种形式都单独定制一个渲染器。Context是Gin最重要的部分。它允许我们在中间件之间传递变量,管理流程,验证请求的JSON并呈现JSON响应。正文: content响应字符串,json,及......
  • ES搜索框架--自定义评分规则
    一、评分规则需求按照用户画像(不同的标签分数)和用户省份在用户查询时,对查询结果进行自定义评分二、ES自定义评分方式参考:博客:https://blog.csdn.net/W2044377578/article/details/128636611官网:https://www.elastic.co/guide/en/elasticsearch/guide/master/function-score-query.......
  • vue iview table实现动态自定义表头
    一、前言众所周知,iview中有一个表格组件Table,用于展示多条结构类似的数据。之前遇到过一个需求,要手动控制table的表头显示。就是假如table表格一共有10列数据,可以通过设置勾选,决定显示多少列二、代码为了代码的复用性,将配置页面单独抽成了组件,所以代码中会有组件之间传值父组件......
  • GORM自定义类型
    GORM自定义类型官网地址官方也有一个用来收集自定义的类型的仓库:https://github.com/go-gorm/datatypes场景时间类型初始的时间类型只有time.time类型,而我们习惯输入和展示的结构是形如2023-04-0812:12:12这种。这种格式需要被程序转化为time.time类型被orm使用,从数据库......
  • vue3中的自定义指令
    1.适用到自定义指令的场景 防抖、图片懒加载、一键Copy的功能、拖拽、页面水印、权限校验、输入框自动聚焦、相对时间转换、下拉菜单2.个人需求:在后台系统中,有很多表单提交组件,其中很多限制数字且限制条件不同。最初使用oninput="value=value.replace(/[^\d]/g,'')"来显示......
  • 文件批量改名高手,文件怎么随机改名,支持自定义生成长度
    如何批量重命名多个文件呢?有没有简单一点的方法呢?小编的回答当然是有的啦,下面一起来试试这个新的技巧,希望能给大家带来帮助。所需工具安装一个文件批量改名高手文件素材若干操作步骤步骤1:运行【文件批量改名高手】,在“文件批量重命名”中,导入文件,支持多种导入文件的方式步骤2:确定都......
  • ChatGPT垂直行业私有数据知识库功能-咨询接口采用流式响应输出-JS和Golang实现流式响
    近期开发私有数据知识库功能,想要实现和ChatGPT聊天效果类似的逐字流式输出展示效果。GPT3.5本身就有流式聊天补全接口,后端Golang对接后,也需要能流式输出。下面就介绍下前端JS后端Golang来实现这种输出效果 大部分介绍是使用EventStream来实现,我现在不使用EventStream也来实现......
  • 自定义运行时异常(非检查异常)
    写一个类继承Exception或其子类,然后在其他类中使用该异常注意:自定义的异常为运行时异常,因为运行时异常为非检查异常,并不需要程序员显示的抛出异常,但是为了更好的去检测程序,所以自定义运行时异常自定义运行时异常的使用形式://自定义构造带......
  • 自定义 DNS 服务
    如果你在使用Deployment运行CoreDNS,则该Deployment通常会向外暴露为一个具有静态IP地址Kubernetes服务。kubelet使用--cluster-dns=<DNS服务IP>标志将DNS解析器的信息传递给每个容器。DNS名称也需要域名。你可在kubelet中使用--cluster-domain=<默认本地......
  • 一统天下 flutter - widget 状态管理: 状态管理 - 自定义 controller
    一统天下flutterhttps://github.com/webabcd/flutter_demo作者webabcd一统天下flutter-widget状态管理:状态管理-自定义controller示例如下:lib\state\controller.dart/**状态管理-自定义controller**为自定义组件指定一个自定义controller后,就可......