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)
}
相关推荐
一灯架构2 小时前
90%的人答错!一文带你彻底搞懂ArrayList
java·后端
踏着七彩祥云的小丑2 小时前
pytest——Mark标记
开发语言·python·pytest
Dream of maid2 小时前
Python12(网络编程)
开发语言·网络·php
W23035765732 小时前
经典算法:最长上升子序列(LIS)深度解析 C++ 实现
开发语言·c++·算法
Y4090013 小时前
【多线程】线程安全(1)
java·开发语言·jvm
不爱吃炸鸡柳3 小时前
Python入门第一课:零基础认识Python + 环境搭建 + 基础语法精讲
开发语言·python
minji...3 小时前
Linux 线程同步与互斥(三) 生产者消费者模型,基于阻塞队列的生产者消费者模型的代码实现
linux·运维·服务器·开发语言·网络·c++·算法
mldong3 小时前
Python开发者狂喜!200+课时FastAPI全栈实战合集,10大模块持续更新中🔥
后端
Dxy12393102163 小时前
Python基于BERT的上下文纠错详解
开发语言·python·bert
GreenTea4 小时前
从 Claw-Code 看 AI 驱动的大型项目开发:2 人 + 10 个自治 Agent 如何产出 48K 行 Rust 代码
前端·人工智能·后端