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)
}
相关推荐
2501_941111248 分钟前
C++与自动驾驶系统
开发语言·c++·算法
2501_9411116921 分钟前
C++中的枚举类高级用法
开发语言·c++·算法
chilavert31827 分钟前
技术演进中的开发沉思-191 JavaScript: 发展历程(上篇)
开发语言·javascript·ecmascript
努力的小郑30 分钟前
今晚Cloudflare一哆嗦,我的加班计划全泡汤
前端·后端·程序员
百***618731 分钟前
springboot整合mybatis-plus(保姆教学) 及搭建项目
spring boot·后端·mybatis
q***58191 小时前
Spring全家桶简介
java·后端·spring
l1t1 小时前
调用python函数的不同方法效率对比测试
开发语言·数据库·python·sql·duckdb
武昌库里写JAVA1 小时前
微擎服务器配置要求,微擎云主机多少钱一年?
java·vue.js·spring boot·后端·sql
IUGEI1 小时前
深入解析HTTP长连接原理
java·网络·后端·网络协议·tcp/ip·http·https