Go使用logrus框架

Go中使用logrus框架将日志保存在文件和控制台输出

  1. 安装
shell 复制代码
go get github.com/sirupsen/logrus
go get github.com/lestrrat-go/file-rotatelogs
go get github.com/rifflock/lfshook
  1. 完整代码
go 复制代码
import (
	"fmt"
	rotatelogs "github.com/lestrrat-go/file-rotatelogs"
	"github.com/rifflock/lfshook"
	"github.com/sirupsen/logrus"
	"io"
	"os"
	"path"
	"time"
)

var LogFile *logrus.Logger

func init() {
	LogFile = loggerToFile()
}

// 日志记录到文件
func loggerToFile() *logrus.Logger {

	logFilePath := "/data/logs"
	logFileName := "log_info"

	// 日志文件
	fileName := path.Join(logFilePath, logFileName)

	// 写入文件
	src, err := os.OpenFile(fileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	if err != nil {
		fmt.Println("err", err)
	}

	// 实例化
	logger := logrus.New()

	//设置日志级别
	logger.SetLevel(logrus.InfoLevel)
	logger.SetReportCaller(true)
	//设置输出
	writers := []io.Writer{
		src,
		os.Stdout}
	// Log.Out = src
	fileAndStdoutWriter := io.MultiWriter(writers...)
	if err == nil {
		logger.SetOutput(fileAndStdoutWriter)
	} else {
		logger.Info("failed to log to file.")
	}

	// 设置 rotatelogs
	logWriter, err := rotatelogs.New(
		// 分割后的文件名称
		fileName+".%Y%m%d.log",

		// 生成软链,指向最新日志文件
		rotatelogs.WithLinkName(fileName),

		// 设置最大保存时间(30天)
		rotatelogs.WithMaxAge(30*24*time.Hour),

		// 设置日志切割时间间隔(1天)
		rotatelogs.WithRotationTime(24*time.Hour),
	)

	writeMap := lfshook.WriterMap{
		logrus.InfoLevel:  logWriter,
		logrus.FatalLevel: logWriter,
		logrus.DebugLevel: logWriter,
		logrus.WarnLevel:  logWriter,
		logrus.ErrorLevel: logWriter,
		logrus.PanicLevel: logWriter,
	}

	lfHook := lfshook.NewHook(writeMap, &logrus.TextFormatter{
		TimestampFormat: "2006-01-02 15:04:05",
	})

	// 新增 Hook
	logger.AddHook(lfHook)

	return logger
}
  1. Gin使用
go 复制代码
import (
	"github.com/gin-gonic/gin"
	"github.com/sirupsen/logrus"
	"39ai-http-go/util"
	"time"
)

func LogToFileMiddleware(c *gin.Context) {
	logger := util.LogFile
	// 开始时间
	startTime := time.Now()

	// 处理请求
	c.Next()

	// 结束时间
	endTime := time.Now()

	// 执行时间
	latencyTime := endTime.Sub(startTime)

	// 请求方式
	reqMethod := c.Request.Method

	// 请求路由
	reqUri := c.Request.RequestURI

	// 状态码
	statusCode := c.Writer.Status()

	// 请求IP
	clientIP := c.ClientIP()

	// 日志格式
	logger.WithFields(logrus.Fields{
		"status_code":  statusCode,
		"latency_time": latencyTime,
		"client_ip":    clientIP,
		"req_method":   reqMethod,
		"req_uri":      reqUri,
	}).Info()
}

gin中

go 复制代码
engine := gin.Default()
engine.Use(middle.LogToFileMiddleware)
  1. 全局使用
    自己封装或者直接使用 var LogFile *logrus.Logger 变量
go 复制代码
//  示例
var log = util.LogFile

func main(){
	param := "hello"
	log.Infof("程序启动 %v", param)
}
相关推荐
heimeiyingwang2 分钟前
【架构实战】可观测性三支柱实战:Metrics、Logging、Tracing 如何统一落地
开发语言·架构·php
用户125758524363 分钟前
对象存储 URL 为什么别到处拼:后台附件预览要验这一层
后端·go·ai编程
步行cgn10 分钟前
MyBatis 一对多关联映射详解
java·后端
阿弱13 分钟前
pi 扩展机制:加载、执行与能力
后端·llm·agent
caimouse23 分钟前
ReactOS 图形系统分析(53):系统库存对象 — stockobj.c
c语言·开发语言·spring
ZJU_统一阿萨姆1 小时前
【推理优化进阶】通信关键路径:NCCL、RDMA 与计算通信重叠
开发语言·人工智能·语言模型·架构·系统架构
圣殿骑士-Khtangc1 小时前
Go-TLS-SSL安全通信从证书管理到双向认证
golang
我不是疯子是傻子1 小时前
Qt 程序打包部署全攻略:从 windeployqt 到 Inno Setup 的静默安装与版本迭代实战
开发语言·qt
省长1 小时前
Sa-Token v1.46.0 发布 🚀,来看看有没有令你心动的功能!
java·后端·开源
tech_zjf1 小时前
当 AI 把 Next.js Route 越写越快:我为什么做了 next-route-kit
前端·后端