Golang中日志使用详解
日志库介绍
rotatelogs "github.com/lestrrat-go/file-rotatelogs
github.com/rifflock/lfshook
github.com/sirupsen/logrus
这三个包通常被一起使用是为了实现日志文件的轮转(log rotation)功能。解释一下它们的作用:github.com/lestrrat-go/file-rotatelogs
:- 这是一个用于文件日志轮转的 Go 语言包。它允许你创建按时间轮转的日志文件,确保日志文件不会无限制地增长,而是会按照一定的规则进行切割,例如按天、按小时等。
github.com/rifflock/lfshook
:- 这是 Logrus(一个 Go 语言的日志库)的一个钩子(hook)。Logrus 是一个功能强大的日志库,而 lfshook 允许你将 Logrus 的日志输出写入到文件,并且可以结合
github.com/lestrrat-go/file-rotatelogs
这个包,实现日志文件的定期轮转。
- 这是 Logrus(一个 Go 语言的日志库)的一个钩子(hook)。Logrus 是一个功能强大的日志库,而 lfshook 允许你将 Logrus 的日志输出写入到文件,并且可以结合
github.com/sirupsen/logrus
:- Logrus 是一个非常流行的 Go 语言日志库,提供了丰富的日志功能。它支持日志级别、字段结构化输出等特性,使得日志记录变得更加灵活和可定制。
综合使用这三个包的方式,你可以在应用程序中使用 Logrus 进行日志记录,并通过 lfshook 将日志输出到文件,同时利用 file-rotatelogs 来管理日志文件的轮转,以防止日志文件无限增长而导致的存储问题。这样的组合可以确保你的应用程序能够高效地记录日志,并在需要时保持日志文件的可管理性。
简单日志记录
这是一个简单的日志包(clog)的实现,使用 Logrus、file-rotatelogs 和 lfshook 这三个包来实现日志记录和轮转的功能。
package clog import ( "fmt" "os" "path" "time" rotatelogs "github.com/lestrrat-go/file-rotatelogs" "github.com/rifflock/lfshook" "github.com/sirupsen/logrus" ) // 日志文件路径和文件名 var ( logFilePath = "./log/" logFileName = "system.log" ) // Logger 是日志记录器实例 var Logger *logrus.Logger // init 函数在包被导入时执行,用于初始化日志设置 func init() { // 初始化日志记录器 Logger = logrus.New() // 设置日志级别为 Debug Logger.SetLevel(logrus.DebugLevel) // 设置输出到文件 fileName := path.Join(logFilePath, logFileName) src, err := os.OpenFile(fileName, os.O_APPEND|os.O_WRONLY, os.ModeAppend) if err != nil { fmt.Println("err", err) } Logger.Out = src // 设置 rotatelogs,实现日志文件轮转 logWriter, _ := rotatelogs.New( fileName+".%Y%m%d.log", rotatelogs.WithLinkName(fileName), rotatelogs.WithMaxAge(15*24*time.Hour), rotatelogs.WithRotationTime(24*time.Hour), ) // 配置 lfshook,将不同日志级别的日志写入同一个文件 writeMap := lfshook.WriterMap{ logrus.InfoLevel: logWriter, logrus.FatalLevel: logWriter, logrus.DebugLevel: logWriter, logrus.WarnLevel: logWriter, logrus.ErrorLevel: logWriter, logrus.PanicLevel: logWriter, } // 添加 lfshook 到 Logger Logger.AddHook(lfshook.NewHook(writeMap, &logrus.TextFormatter{ TimestampFormat: "2006-01-02 15:04:05", })) } // Add 函数用于添加日志记录 func Add(requestId, info string, err error) { if err != nil { // 如果有错误,记录 Error 级别的日志 Logger.WithFields(logrus.Fields{ "request_id": requestId, "info": info, "error": err.Error(), }).Error() } else { // 如果没有错误,记录 Info 级别的日志 Logger.WithFields(logrus.Fields{ "request_id": requestId, "info": info, "error": "", }).Info() } }
logFilePath
和logFileName
定义了日志文件的路径和名称。Logger
是 logrus 的日志记录器实例。init
函数在包被导入时执行,用于初始化 Logger、设置日志级别、输出到文件、配置文件轮转等。rotatelogs.New
创建了一个按时间轮转的日志写入器。lfshook.WriterMap
定义了不同日志级别对应的写入器,确保不同级别的日志写入到同一个文件。lfshook.NewHook
创建了一个 lfshook 钩子,将其添加到 Logger 中。Add
函数用于添加日志记录,根据是否有错误来选择记录 Info 或 Error 级别的日志。
结合Gin框架使用
这是一个基于 Gin 框架的中间件(LoggerMiddleware),用于记录请求的相关信息
package auth import ( "encoding/json" "fmt" "time" "go-yinhe-cloud/middleware/clog" "go-yinhe-cloud/models" "go-yinhe-cloud/pkg/util" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" ) // LoggerMiddleware 返回一个 Gin 中间件,用于记录请求日志 func LoggerMiddleware() gin.HandlerFunc { return func(c *gin.Context) { // 记录请求开始时间 startTime := time.Now() // 处理请求 c.Next() // 记录请求结束时间 endTime := time.Now() // 计算请求执行时间 latencyTime := endTime.Sub(startTime) // 获取请求相关信息 reqMethod := c.Request.Method // 请求方式 reqUrl := c.Request.RequestURI // 请求路由 statusCode := c.Writer.Status() // 状态码 clientIP := c.ClientIP() // 请求IP header := c.GetHeader("User-Agent") + "@@" + c.GetHeader("token") // 请求头 _ = c.Request.ParseMultipartForm(128) reqForm := c.Request.Form var reqJsonStr string // 将请求数据转为 JSON 字符串 if len(reqForm) > 0 { reqJsonByte, _ := json.Marshal(reqForm) reqJsonStr = string(reqJsonByte) } // 获取请求中的 requestId requestId := c.GetString("requestId") // 获取 Gin 中间件中的错误信息 var errorsStr string for _, err := range c.Errors.Errors() { errorsStr += err + "; " } // 记录请求日志到文件 clog.Logger.WithFields(logrus.Fields{ "request_id": requestId, "status_code": statusCode, "latency_time": latencyTime, "client_ip": clientIP, "req_method": reqMethod, "ua_token": header, "req_uri": reqUrl, "body": reqJsonStr, "err_str": errorsStr, }).Info() } }
- LoggerMiddleware 返回一个 Gin 中间件函数。
- 记录请求开始时间和结束时间,计算请求执行时间。
- 获取请求的方法、路由、状态码、IP、请求头等信息。
- 将请求数据转为 JSON 字符串。
- 获取 Gin 中间件中的错误信息,并拼接成字符串。
- 记录请求日志到文件,使用 clog.Logger。
以上就是Golang中日志使用详解的详细内容,更多关于Golang日志使用的资料请关注脚本之家其它相关文章!
相关文章
Go 实现 WebSockets和什么是 WebSockets
这篇文章主要介绍了Go 实现 WebSockets和什么是 WebSockets,WebSockets 是构建实时应用程序的第一大解决方案,在线游戏、即时通讯、跟踪应用程序等,下文相关内容介绍需要的小伙伴可以参考一下2022-04-04
最新评论