代码
package main
import (
"fmt"
"net/http"
"os"
"path"
"time"
"github.com/rifflock/lfshook"
rotatelogs "github.com/lestrrat-go/file-rotatelogs"
"github.com/sirupsen/logrus"
"github.com/gin-gonic/gin"
)
// 自定义日志变量
var (
logFilePath = "./" // 日志存储路径
logFileName = "bb.log" // 日志文件名
)
func main() {
engine := gin.Default()
// 使用日志
engine.Use(logMiddleware())
engine.GET("log2", func(c *gin.Context) {
responseData := struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data interface{} `json:"data"`
}{http.StatusOK, "ok", nil}
c.JSON(http.StatusOK, responseData)
return
})
engine.Run(":9002")
}
func logMiddleware() gin.HandlerFunc {
// 定义日志文件
fileName := path.Join(logFilePath, logFileName)
// 创建日志文件
file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
fmt.Println("打开日志文件失败", err)
return nil
}
// 实例化
logger := logrus.New()
// 设置日志级别
logger.SetLevel(logrus.DebugLevel)
// 绑定日志输出文件
logger.Out = file
// 设置rotatelogs 绑定日志策略
rotate, _ := rotatelogs.New(
// 分割后的文件名称
fileName+".%Y%m%d.log",
// 设置软链 指向最新日志文件
rotatelogs.WithLinkName(fileName),
// 设置最大保存时间 (7天)
rotatelogs.WithMaxAge(7*24*time.Hour),
// 设置每次生成日志文件的时间间隔 (1天)
rotatelogs.WithRotationTime(24*time.Hour),
)
// 设置hook 并绑定rotatelog
writerMap := lfshook.WriterMap{
logrus.InfoLevel: rotate,
logrus.FatalLevel: rotate,
logrus.DebugLevel: rotate,
logrus.WarnLevel: rotate,
logrus.ErrorLevel: rotate,
logrus.PanicLevel: rotate,
}
// logrus添加hook
logger.AddHook(lfshook.NewHook(writerMap, &logrus.JSONFormatter{
TimestampFormat: "2006-02-02 02:02:02", // 必须配置, 其他下面的可删除
//DisableTimestamp: false,
//DisableHTMLEscape: false,
//DataKey: "",
//FieldMap: nil,
//CallerPrettyfier: nil,
//PrettyPrint: false,
}))
return func(c *gin.Context) {
c.Next()
logger.WithFields(logrus.Fields{
"url": c.Request.URL,
"method": c.Request.Method,
"remoteAddr": c.Request.RemoteAddr,
"clientIp": c.ClientIP(),
}).Info()
}
}