直接回答: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)
// 设置日志输出JSON格式
//LogInstance.SetFormatter(&logrus.JSONFormatter{})
LogInstance.SetFormatter(&logrus.TextFormatter{})
// 设置日志记录级别
LogInstance.SetLevel(logrus.DebugLevel)
}

// 日志滚动设置
func rolling(logFile string) {
// 设置输出
LogInstance.SetOutput(&lumberjack.Logger{
Filename: logFile, //日志文件位置
MaxSize: 1, // 单文件最大容量,单位是MB
MaxBackups: 3, // 最大保留过期文件个数
MaxAge: 7, // 保留过期文件的最大时间间隔,单位是天
Compress: true, // 是否需要压缩滚动日志, 使用的 gzip 压缩
})
}

使用

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"
// 服务器配置
//dsn := "root:Rlx2022!@tcp(127.0.0.1:3306)/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()

// SetMaxIdleConns 设置空闲连接池中连接的最大数量
sqlDB.SetMaxIdleConns(10)

// SetMaxOpenConns 设置打开数据库连接的最大数量。
sqlDB.SetMaxOpenConns(100)

// SetConnMaxLifetime 设置了连接可复用的最大时间。
sqlDB.SetConnMaxLifetime(time.Hour)
// 第一次运行可能需要initDb下

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 Bucket = "IOT"
//var Org = "example.com"
//var token = "替换成你自己的 InfluxDB Token"

// Store the URL of your InfluxDB instance
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 {

// rds, err := redis.Dial("tcp", "127.0.0.1:6379")
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
// gin.Default()带有默认的log,可以使用gin.new(),这样就是一个纯净的
logfile, err := os.Create("./gin_http.log")
if err != nil {
fmt.Println("不能创建日志")
}
gin.SetMode(gin.ReleaseMode)
gin.DefaultWriter = io.MultiWriter(logfile)
g := gin.Default()
//g.Use(UserMiddle)
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)
}Ï

这篇笔记整理自我自己的实践记录,如果做法有出入,或者你踩过别的坑,欢迎到留言板一起聊聊。

站内搜索

没有找到内容!