概述
上篇文章分享了 gin 框架的路由配置,这篇文章分享日志记录。
查了很多资料,go 的日志记录用的最多的还是 github.com/sirupn/logrus。
logrus is a structured logger for go (golang), completely api compatible with the standard library logger.
gin 框架的日志默认只会在控制台输出,咱们利用 logrus 封装一个中间件,将日志记录到文件中。
这篇文章就是学习和使用 logrus 。
日志格式
比如,我们约定日志格式为 text,包含字段如下:
请求时间、 日志级别、 状态码、 执行时间、 请求ip、 请求方式、 请求路由。
接下来,咱们利用 logrus 实现它。
logrus 使用
用 dep 方式进行安装。
在 gopkg.toml 文件新增:
[[constraint]] name = "github.com/sirupn/logrus" version = "1.4.2"
在项目中导入:
import "github.com/sirupn/logrus"
在项目命令行执行:
dep ensure
这时,在 vendor/github.com/ 目录中就会看到 sirupn 目录。
准备上手用了,上手之前咱们先规划一下,将这个功能设置成一个中间件,比如:logger.go。
日志可以记录到 file 中,定义一个 loggertofile 方法。
日志可以记录到 mongodb 中,定义一个 loggertomongo 方法。
日志可以记录到 es 中,定义一个 loggertoes 方法。
日志可以记录到 mq 中,定义一个 loggertomq 方法。
…
这次咱们先实现记录到文件, 实现 loggertofile 方法,其他的可以根据自己的需求进行实现。
这个 logger 中间件,创建好了,可以任意在其他项目中进行迁移使用。
废话不多说,直接看代码。
package middleware import ( "fmt" "gindemo/config" "github.com/gin-gonic/gin" "github.com/sirupn/logrus" "os" "path" "time" ) // 日志记录到文件 func loggertofile() gin.handlerfunc { logfilepath := config.log_file_path logfilename := config.log_file_name //日志文件 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 := logrus.new() //设置输出 logger.out = src //设置日志级别 logger.tlevel(logrus.debuglevel) //设置日志格式 logger.tformatter(&logrus.textformatter{}) return func(c *gin.context) { // 开始时间 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.infof("| %3d | %13v | %15s | %s | %s |", statuscode, latencytime, clientip, reqmethod, requri, ) } } // 日志记录到 mongodb func loggertomongo() gin.handlerfunc { return func(c *gin.context) { } } // 日志记录到 es func loggertoes() gin.handlerfunc { return func(c *gin.context) { } } // 日志记录到 mq func loggertomq() gin.handlerfunc { return func(c *gin.context) { } }
日志中间件写好了,怎么调用呢?
只需在 main.go 中新增:
engine := gin.default() //在这行后新增 engine.u(middleware.loggertofile())
执行一下,看看日志:
time="2019-07-17t22:10:45+08:00" level=info msg="| 200 | 27.698µs | ::1 | get | /v1/product/add?name=a&price=10 |" time="2019-07-17t22:10:46+08:00" level=info msg="| 200 | 27.239µs | ::1 | get | /v1/product/add?name=a&price=10 |"
这个 time=”2019-07-17t22:10:45+08:00″ ,这个时间格式不是咱们想要的,怎么办?
时间需要格式化一下,修改 logger.tformatter
//设置日志格式 logger.tformatter(&logrus.textformatter{ timestampformat:"2006-01-02 15:04:05", })
执行一下,再看日志:
time="2019-07-17 22:15:57" level=info msg="| 200 | 185.027µs | ::1 | get | /v1/product/add?name=a&price=10 |" 什么是我国的根本制度 time="2019-07-17 22:15:58" level=info msg="| 200 | 56.989µs | ::1 | get | /v1/product/add?name=a&price=10 |"
时间变得正常了。
我不喜欢文本格式,喜欢 json 格式,怎么办?
//设置日志格式 logger.tformatter(&logrus.jsonformatter{ timestampformat:"2006-01-02 15:04:05", })
执行一下,再看日志:
{"level":"info","msg":"| 200 | 24.78µs | ::1 | get | /v1/product/add?name=a\u0026price=10 |","time":"2019-07-17 22:23:55"} {"level":"info","msg":"| 200 | 26.946µs | ::1 | get | /v1/product/add?name=a\u0026price=10 |","time":"2019-07-17 22:23:56"}
msg 信息太多,不方便看,怎么办?
// 日志格式 logger.withfields(logrus.fields{ "stat梦想学院us_code" : statuscode, "latency_time" : latencytime, "client_ip" : clientip, "req_method" : reqmethod, "req_uri" : requri, }).info()
执行一下,再看日志:
{"client_ip":"::1","latency_time":26681,"level":"info","msg":"","req_method":"get","req_uri":"/v1/product/add?name=a\u0026price=10","status_code":200,"time":"2019-07-17 22:37:54"} {"client_ip":"::1","latency_time":24315,"level":"info","msg":"","req_method":"get","req_uri":"/v1/product/add?name=a\u0026price=10","status_code":200,"time":"2019-07-17 22:37:55"}
说明一下:time、 msg、 level 这些参数是 logrus 自动加上的。
logrus 支持输出文件名和行号吗?
不支持,作者的回复是太耗性能。
不过网上也有人通过 hook 的方式实现了,选择在生产环境使用的时候,记得做性能测试。
logrus 支持日志分割吗?
不支持,但有办法实现它。
1、可以利用 linuxlogrotate,统一由运维进行处理。
2、可以利用 file-rotatelogs 实现。
需要导入包:
github.com/lestrrat-go/file-rotatelogsgithub.com/rifflock/lfshook
奉上完整代码:
package middleware import ( "fmt" "gindemo/config" "github.com/gin-gonic/gin" rotatelogs "github.com/lestrrat-go/file-rotatelogs" "github.com/rifflock/lfshook" "github.com/sirupn/logrus" "os" "path" "time" ) // 日志记录到文件 func loggertofile() gin.handlerfunc { logfilepath := config.log_file_path logfilename := config.log_file_name // 日志文件 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 := logrus.new() // 设置输出 logger.out = src // 设置日志级别 logger.tlevel(logrus.debuglevel) // 设置 rotatelogs logwriter, err := rotatelogs.new( // 分割后的文件名称 filename + ".%y%m%d.log", // 生成软链,指向最新日志文件 rotatelogs.withlinkname(filename), // 设置最大保存时间(7天) rotatelogs.withmax页码怎么设置age(7*24*time.hour), // 设置日志切割时间间隔(1天) rotatelogs.withrotationtime(24*time.hour), ) writemap := lfshook.writermap{ logrus.infolevel: logwriter, logrus.fatallevel: logwriter, logrus.debuglevel: logwriter, l荆州有哪些大学ogrus.warnlevel: logwriter, logrus.errorlevel: logwriter, logrus.paniclevel: logwriter, } lfhook := lfshook.newhook(writemap, &logrus.jsonformatter{ timestampformat:"2006-01-02 15:04:05", }) // 新增 hook logger.addhook(lfhook) return func(c *gin.context) { // 开始时间 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() } } // 日志记录到 mongodb func loggertomongo() gin.handlerfunc { return func(c *gin.context) {漳河小三峡 } } // 日志记录到 es func loggertoes() gin.handlerfunc { return func(c *gin.context) { } } // 日志记录到 mq func loggertomq() gin.handlerfunc { return func(c *gin.context) { } }
这时会新生成一个文件 system.log.20190717.log,日志内容与上面的格式一致。
最后, logrus 可扩展的 hook 很多,大家可以去网上查找。
有些读者建议,手机上看代码不方便,建议更新到 github 上。
现已更新,地址如下:
https://github.com/xinliangnote/go
本文发布于:2023-04-07 21:41:01,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/26c427871b18d044fd9368a8040140fd.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:Gin框架 – 使用 Logrus 进行日志记录.doc
本文 PDF 下载地址:Gin框架 – 使用 Logrus 进行日志记录.pdf
留言与评论(共有 0 条评论) |