日志文件的写入

```go package main

import ( “io” “os”

  1. "github.com/gin-gonic/gin"

)

func main() { gin.DisableConsoleColor()

  1. // Logging to a file.
  2. f, _ := os.Create("gin.log")
  3. gin.DefaultWriter = io.MultiWriter(f)
  4. // 如果需要同时将日志写入文件和控制台,请使用以下代码。
  5. // gin.DefaultWriter = io.MultiWriter(f, os.Stdout)
  6. r := gin.Default()
  7. r.GET("/ping", func(c *gin.Context) {
  8. c.String(200, "pong")
  9. })
  10. r.Run()

}

  1. > > <a name="e82839e8"></a>
  2. #### 日志分割
  3. > ```go
  4. package main
  5. import (
  6. "fmt"
  7. "github.com/gin-gonic/gin"
  8. rotatelogs "github.com/lestrrat-go/file-rotatelogs"
  9. "github.com/rifflock/lfshook"
  10. "github.com/sirupsen/logrus"
  11. "os"
  12. "path"
  13. "time"
  14. )
  15. var (
  16. //日志地址
  17. logFilePath = "./"
  18. //日志文件名
  19. logFileName = "system.log"
  20. )
  21. func logerMiddleware() gin.HandlerFunc {
  22. // 日志文件
  23. fileName := path.Join(logFilePath, logFileName)
  24. // 写入文件
  25. src, err := os.OpenFile(fileName, os.O_APPEND|os.O_WRONLY, os.ModeAppend)
  26. if err != nil {
  27. fmt.Println("err", err)
  28. }
  29. // 实例化
  30. logger := logrus.New()
  31. //设置日志级别
  32. logger.SetLevel(logrus.DebugLevel)
  33. //设置输出
  34. logger.Out = src
  35. // 设置 rotatelogs
  36. logWriter, err := rotatelogs.New(
  37. // 分割后的文件名称
  38. fileName+".%Y%m%d.log",
  39. // 生成软链,指向最新日志文件
  40. rotatelogs.WithLinkName(fileName),
  41. // 设置最大保存时间(7天)
  42. rotatelogs.WithMaxAge(7*24*time.Hour),
  43. // 设置日志切割时间间隔(1天)
  44. rotatelogs.WithRotationTime(24*time.Hour),
  45. )
  46. writeMap := lfshook.WriterMap{
  47. logrus.InfoLevel: logWriter,
  48. logrus.FatalLevel: logWriter,
  49. logrus.DebugLevel: logWriter,
  50. logrus.WarnLevel: logWriter,
  51. logrus.ErrorLevel: logWriter,
  52. logrus.PanicLevel: logWriter,
  53. }
  54. logger.AddHook(lfshook.NewHook(writeMap, &logrus.JSONFormatter{
  55. TimestampFormat: "2006-01-02 15:04:05",
  56. }))
  57. return func(c *gin.Context) {
  58. //开始时间
  59. startTime := time.Now()
  60. //处理请求
  61. c.Next()
  62. //结束时间
  63. endTime := time.Now()
  64. // 执行时间
  65. latencyTime := endTime.Sub(startTime)
  66. //请求方式
  67. reqMethod := c.Request.Method
  68. //请求路由
  69. reqUrl := c.Request.RequestURI
  70. //状态码
  71. statusCode := c.Writer.Status()
  72. //请求ip
  73. clientIP := c.ClientIP()
  74. // 日志格式
  75. logger.WithFields(logrus.Fields{
  76. "status_code": statusCode,
  77. "latency_time": latencyTime,
  78. "client_ip": clientIP,
  79. "req_method": reqMethod,
  80. "req_uri": reqUrl,
  81. }).Info()
  82. }
  83. }
  84. func main() {
  85. //禁用控制台颜色
  86. gin.DisableConsoleColor()
  87. // Logging to a file.
  88. // 如果需要同时将日志写入文件和控制台,请使用以下代码。
  89. r := gin.Default()
  90. r.Use(logerMiddleware())
  91. r.GET("/ping", func(c *gin.Context) {
  92. c.String(200, "pong")
  93. })
  94. r.Run()
  95. }