用 logrus + lumberjack 做 Go 应用日志
直接回答:logrus 负责分级和格式化,lumberjack 负责按大小切割和保留,把 lumberjack.Logger 交给 logrus 当输出就能同时拿到切割和分级两种能力。
go语言的log包logrus
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| package Log
import ( "github.com/natefinch/lumberjack" "github.com/sirupsen/logrus" "path" )
var ( logPath = "./logs" logFile = "gin.log" ) var LogInstance = logrus.New()
func init() { logFileName := path.Join(logPath, logFile) rolling(logFileName) LogInstance.SetFormatter(&logrus.TextFormatter{}) LogInstance.SetLevel(logrus.DebugLevel) }
func rolling(logFile string) { LogInstance.SetOutput(&lumberjack.Logger{ Filename: logFile, MaxSize: 1, MaxBackups: 3, MaxAge: 7, Compress: true, }) }
|
使用
1
| Log.LogInstance.WithFields(logrus.Fields{"package:": "WarnModule", "行:": "89", "Content:": "查询设备在线状态报错" + err.Error()}).Error("Error级别")
|
数据库连接
Mysql
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| package DB
import ( "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" "safety/DB" "time" )
func init() { initMysqlData() }
var MysqlConn = newMysqlConn()
func newMysqlConn() *gorm.DB { dsn := DB.Confs["mysqlUser"] + ":" + DB.Confs["mysqlPWD"] + "@tcp(" + DB.Confs["mysqlIP"] + ":" + DB.Confs["mysqlPort"] + ")/test?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ PrepareStmt: true, DisableForeignKeyConstraintWhenMigrating: true, }) if err != nil { fmt.Println("mysql数据库连接失败:", err) } sqlDB, err := db.DB()
sqlDB.SetMaxIdleConns(10)
sqlDB.SetMaxOpenConns(100)
sqlDB.SetConnMaxLifetime(time.Hour)
return db }
func GetDB() *gorm.DB { sqlDB, err := MysqlConn.DB() if err != nil { fmt.Errorf("GetDB连接数据库失败") MysqlConn = newMysqlConn() } if err := sqlDB.Ping(); err != nil { _ = sqlDB.Close() MysqlConn = newMysqlConn() } return MysqlConn }
|
数据库初始化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| package DB
import ( "safety/Model/Entity" )
func initMysqlData() { db := GetDB() db.AutoMigrate(&Entity.User{})
db.AutoMigrate(&Entity.YS{}) db.FirstOrCreate(&Entity.User{}, &Entity.User{ UserName: "admin", Name: "系统管理员", PassWord: "替换成你自己的密码哈希", Phone: "", Email: "", UserRoleCode: "1", CommonModel: Entity.CommonModel{ CreatedBy: 1, UpdatedBy: 1, }, })
}
|
influxDB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| package MyInfluxDB
import ( "context" "github.com/influxdata/influxdb-client-go/v2" "safety/DB" )
var Bucket = DB.Confs["influxBucket"] var Org = DB.Confs["influxOrg"] var token = DB.Confs["influxToken"]
var url = "http://localhost:8086" var influxConn = initInflux()
func initInflux() influxdb2.Client { client := influxdb2.NewClient(url, token) return client }
func GetInfluxClicen() influxdb2.Client { ping, err := influxConn.Ping(context.Background()) if err != nil { return nil } if ping { return influxConn } else { influxConn = initInflux() return influxConn }
}
|
Redis
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| package DBredis
import ( "flag" "github.com/gomodule/redigo/redis" "safety/DB" )
var ( Pool *redis.Pool )
func init() { flag.Parse() Pool = newPool(*flag.String("redis数据库地址", DB.Confs["redisIP"]+":"+DB.Confs["redisPort"], "")) } func newPool(addr string) *redis.Pool {
return &redis.Pool{ Dial: func() (redis.Conn, error) { c, err := redis.Dial("tcp", addr) if err != nil { return nil, err } return c, nil }, MaxIdle: 16, MaxActive: 0, IdleTimeout: 300, }
}
|
Gin 的日志
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| logfile, err := os.Create("./gin_http.log") if err != nil { fmt.Println("不能创建日志") } gin.SetMode(gin.ReleaseMode) gin.DefaultWriter = io.MultiWriter(logfile) g := gin.Default() swaggerRouter := g.Group("/swagger") { swaggerRouter.GET("/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) } g.POST("/equipment/realData", Equipment.RealData) userRouter := g.Group("/user") { userRouter.POST("/add", User.Add) userRouter.POST("/findList", User.FindList) userRouter.POST("/edit", User.Edit) userRouter.POST("/queryCurrentUser", User.QueryCurrentUser) userRouter.POST("/changeInfo", User.ChangeInfo) userRouter.POST("/outLogin", User.OutLogin) userRouter.POST("/deleteUser", User.DeleteUser) }Ï
|
这篇笔记整理自我自己的实践记录,如果做法有出入,或者你踩过别的坑,欢迎到留言板一起聊聊。