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)
}
相关推荐
程序员爱钓鱼6 小时前
Node.js 编程实战:测试与调试 - 单元测试与集成测试
前端·后端·node.js
No0d1es6 小时前
2025年12月 GESP CCF编程能力等级认证Python五级真题
开发语言·python·青少年编程·等级考试·gesp·ccf
风送雨6 小时前
Go 语言进阶学习:第 2 周 —— 接口、反射与错误处理进阶
开发语言·学习·golang
福楠6 小时前
模拟实现stack、queue、priority_queue
c语言·开发语言·数据结构·c++
峰上踏雪6 小时前
Go(Golang)Windows 环境配置关键点总结
开发语言·windows·golang·go语言
我不是8神6 小时前
go语言语法基础全面总结
开发语言·golang·xcode
No0d1es6 小时前
2025年12月 GESP CCF编程能力等级认证Python一级真题
开发语言·python·青少年编程·gesp·ccf
小六子成长记6 小时前
C++:map和set重点解析
开发语言·c++
洛小豆6 小时前
她问我:服务器快被垃圾文件塞爆了,怎么破?我说:给文件办个“临时居住证”
后端·面试