脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - golang xorm 自定义日志记录器之使用zap实现日志输出、切割日志(最新)

golang xorm 自定义日志记录器之使用zap实现日志输出、切割日志(最新)

2022-10-29 12:18一个搬砖的程序猿 Golang

这篇文章主要介绍了golang xorm 自定义日志记录器,使用zap实现日志输出、切割日志,包括连接postgresql数据库的操作方法及 zap日志工具 ,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要

1.准备并下载好需要的包

  • xorm.io/xorm  
  • xorm.io/core
  • go.uber.org/zap
  • gopkg.in/natefinch/lumberjack.v2  用于切割zap
  • github.com/lib/pq  本文使用postgresql数据库

2. 连接postgresql数据库

?
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
// 创建pg数据库连接
func newDb() (*xorm.Engine, error) {
    source := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable",
        "127.0.0.1", 5432, "postgres", "root", "postgres")
 
    engine, err := xorm.NewEngine("postgres", source)
    if err != nil {
        return nil, err
    }
 
    // 连接池中最大连接数
    engine.SetMaxOpenConns(100)
    // 连接池中最大空闲连接数
    engine.SetMaxIdleConns(10)
    // 单个连接最大存活时间(单位:秒)
    engine.SetConnMaxLifetime(10)
    engine.ShowSQL(true)
 
    // 输出日志 终点部分使用自定义日志记录器
    engine.SetLogger(&customXormLogger{
        level:   xormlog.LOG_INFO,
        showSQL: true,
    })
 
    return engine, nil
}

3. zap日志工具

?
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
// zap
func getZapLog() *zap.Logger {
    loggerName := "db" // 日志文件名称
 
    if logger, has := loggerMap[loggerName]; has {
        return logger
    } else {
        loggerMu.Lock()
 
        output := zapcore.AddSync(&lumberjack.Logger{
            Filename:   "./log",
            MaxSize:    100, // 日志文件最大容量(单位:MB),超过容量,文件会自动分割
            MaxBackups: 1,   // 保留的日志天数(单位:天)
            MaxAge:     10// 保留的日志文件个数,文件数量超过该值,最旧的文件会被删除
        })
 
        // 如果需要可以输出当控制台
        //output = zapcore.NewMultiWriteSyncer(output, os.Stdout)
        level := zapcore.DebugLevel
        _ = level.Set("info") // 设置日志级别  debug info warn error fatal (日志级别从大到小)
 
        core := zapcore.NewCore(
            zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()), // 设置日志输出格式 这块可以自定义
            output,
            zap.NewAtomicLevelAt(level),
        )
        newLogger := zap.New(core, zap.AddStacktrace(zapcore.ErrorLevel))
 
        loggerMap[loggerName] = newLogger
        loggerMu.Unlock()
        return newLogger
    }
}

4.实现xorm 自定义日志记录器

?
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// 重点:实现xormLogger接口 自定义记录器
type customXormLogger struct {
    level   xormlog.LogLevel
    showSQL bool
}
 
var _ xormlog.Logger = &customXormLogger{}
 
func (c *customXormLogger) Debug(v ...interface{}) {
    if c.level <= xormlog.LOG_DEBUG {
        fmt.Println(v...)
    }
    return
}
 
func (c *customXormLogger) Debugf(format string, v ...interface{}) {
    if c.level <= xormlog.LOG_DEBUG {
        getZapLog().Debug(fmt.Sprint(v...))
    }
    return
}
 
func (c *customXormLogger) Error(v ...interface{}) {
    if c.level <= xormlog.LOG_ERR {
        fmt.Println(v...)
    }
    return
}
 
func (c *customXormLogger) Errorf(format string, v ...interface{}) {
    if c.level <= xormlog.LOG_ERR {
        getZapLog().Error(fmt.Sprint(v...))
    }
    return
}
 
func (c *customXormLogger) Info(v ...interface{}) {
    if c.level <= xormlog.LOG_INFO {
        fmt.Println(v...)
    }
    return
}
 
func (c *customXormLogger) Infof(format string, v ...interface{}) {
    if c.level <= xormlog.LOG_INFO {
        getZapLog().Info(fmt.Sprint(v...))
    }
    return
}
 
func (c *customXormLogger) Warn(v ...interface{}) {
    if c.level <= xormlog.LOG_WARNING {
        fmt.Println(v...)
    }
    return
}
 
func (c *customXormLogger) Warnf(format string, v ...interface{}) {
    if c.level <= xormlog.LOG_WARNING {
        getZapLog().Warn(fmt.Sprint(v...))
    }
    return
}
 
func (c *customXormLogger) Level() xormlog.LogLevel {
    return c.level
}
 
func (c *customXormLogger) SetLevel(l xormlog.LogLevel) {
    c.level = l
    return
}
 
func (c *customXormLogger) ShowSQL(show ...bool) {
    if len(show) == 0 {
        c.showSQL = true
        return
    }
    c.showSQL = show[0]
}
 
func (c *customXormLogger) IsShowSQL() bool {
    return c.showSQL
}

5.使用

?
1
2
3
4
5
6
7
// 测试
    pgDb, err := newDb()
    fmt.Println(err)
 
    queryInterface, _ := pgDb.SQL("select * from test").QueryInterface()
 
    fmt.Println(queryInterface)

完整代码

?
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
package main
 
import (
    "fmt"
    _ "github.com/lib/pq"
    "go.uber.org/zap"
    "go.uber.org/zap/zapcore"
    "gopkg.in/natefinch/lumberjack.v2"
    "sync"
    "xorm.io/xorm"
    xormlog "xorm.io/xorm/log"
)
 
var (
    loggerMap = map[string]*zap.Logger{}
    loggerMu  = &sync.Mutex{}
)
 
// 创建pg数据库连接
func newDb() (*xorm.Engine, error) {
    source := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable",
        "127.0.0.1", 5432, "postgres", "root", "postgres")
 
    engine, err := xorm.NewEngine("postgres", source)
    if err != nil {
        return nil, err
    }
 
    // 连接池中最大连接数
    engine.SetMaxOpenConns(100)
    // 连接池中最大空闲连接数
    engine.SetMaxIdleConns(10)
    // 单个连接最大存活时间(单位:秒)
    engine.SetConnMaxLifetime(10)
    engine.ShowSQL(true)
 
    // 输出日志 终点部分使用自定义日志记录器
    engine.SetLogger(&customXormLogger{
        level:   xormlog.LOG_INFO,
        showSQL: true,
    })
 
    return engine, nil
}
 
// zap
func getZapLog() *zap.Logger {
    loggerName := "db" // 日志文件名称
 
    if logger, has := loggerMap[loggerName]; has {
        return logger
    } else {
        loggerMu.Lock()
 
        output := zapcore.AddSync(&lumberjack.Logger{
            Filename:   "./log",
            MaxSize:    100, // 日志文件最大容量(单位:MB),超过容量,文件会自动分割
            MaxBackups: 1,   // 保留的日志天数(单位:天)
            MaxAge:     10// 保留的日志文件个数,文件数量超过该值,最旧的文件会被删除
        })
 
        // 如果需要可以输出当控制台
        //output = zapcore.NewMultiWriteSyncer(output, os.Stdout)
        level := zapcore.DebugLevel
        _ = level.Set("info") // 设置日志级别  debug info warn error fatal (日志级别从大到小)
 
        core := zapcore.NewCore(
            zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()), // 设置日志输出格式 这块可以自定义
            output,
            zap.NewAtomicLevelAt(level),
        )
        newLogger := zap.New(core, zap.AddStacktrace(zapcore.ErrorLevel))
 
        loggerMap[loggerName] = newLogger
        loggerMu.Unlock()
        return newLogger
    }
}
 
// 重点:实现xormLogger接口 自定义记录器
type customXormLogger struct {
    level   xormlog.LogLevel
    showSQL bool
}
 
var _ xormlog.Logger = &customXormLogger{}
 
func (c *customXormLogger) Debug(v ...interface{}) {
    if c.level <= xormlog.LOG_DEBUG {
        fmt.Println(v...)
    }
    return
}
 
func (c *customXormLogger) Debugf(format string, v ...interface{}) {
    if c.level <= xormlog.LOG_DEBUG {
        getZapLog().Debug(fmt.Sprint(v...))
    }
    return
}
 
func (c *customXormLogger) Error(v ...interface{}) {
    if c.level <= xormlog.LOG_ERR {
        fmt.Println(v...)
    }
    return
}
 
func (c *customXormLogger) Errorf(format string, v ...interface{}) {
    if c.level <= xormlog.LOG_ERR {
        getZapLog().Error(fmt.Sprint(v...))
    }
    return
}
 
func (c *customXormLogger) Info(v ...interface{}) {
    if c.level <= xormlog.LOG_INFO {
        fmt.Println(v...)
    }
    return
}
 
func (c *customXormLogger) Infof(format string, v ...interface{}) {
    if c.level <= xormlog.LOG_INFO {
        getZapLog().Info(fmt.Sprint(v...))
    }
    return
}
 
func (c *customXormLogger) Warn(v ...interface{}) {
    if c.level <= xormlog.LOG_WARNING {
        fmt.Println(v...)
    }
    return
}
 
func (c *customXormLogger) Warnf(format string, v ...interface{}) {
    if c.level <= xormlog.LOG_WARNING {
        getZapLog().Warn(fmt.Sprint(v...))
    }
    return
}
 
func (c *customXormLogger) Level() xormlog.LogLevel {
    return c.level
}
 
func (c *customXormLogger) SetLevel(l xormlog.LogLevel) {
    c.level = l
    return
}
 
func (c *customXormLogger) ShowSQL(show ...bool) {
    if len(show) == 0 {
        c.showSQL = true
        return
    }
    c.showSQL = show[0]
}
 
func (c *customXormLogger) IsShowSQL() bool {
    return c.showSQL
}
 
func main() {
    // 测试
    pgDb, err := newDb()
    fmt.Println(err)
 
    queryInterface, _ := pgDb.SQL("select * from test").QueryInterface()
 
    fmt.Println(queryInterface)
}

参考文档

Golang XORM搭配OpenTracing+Jaeger链路监控让SQL执行一览无遗(附源码)

到此这篇关于golang xorm 自定义日志记录器,使用zap实现日志输出、切割日志的文章就介绍到这了,更多相关golang  zap日志内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/Yuuuuuubs/article/details/127513982

延伸 · 阅读

精彩推荐
  • GolangWin7环境下搭建Go开发环境(基于VSCode编辑器)

    Win7环境下搭建Go开发环境(基于VSCode编辑器)

    这篇文章主要介绍了Win7环境下搭建Go开发环境(基于VSCode编辑器),需要的朋友可以参考下 ...

    脚本之家5612020-05-05
  • GolanggORM操作MySQL的实现

    gORM操作MySQL的实现

    本文主要介绍了gORM操作MySQL的实现,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧...

    用户39165515196219242021-08-15
  • GolangGo通道channel通过通信共享内存

    Go通道channel通过通信共享内存

    这篇文章主要为大家介绍了Go通道channel通过通信共享内存示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    LiberHome10732022-07-05
  • GolangGolang 拷贝Array或Slice的操作

    Golang 拷贝Array或Slice的操作

    这篇文章主要介绍了Golang 拷贝Array或Slice的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    neweastsun6612021-06-07
  • Golanggo实现整型的二进制转化的方法

    go实现整型的二进制转化的方法

    这篇文章主要介绍了go实现整型的二进制转化的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下 ...

    feiquan5902020-05-27
  • Golang那些 Go 语言实现的语言现在发展怎么样了?

    那些 Go 语言实现的语言现在发展怎么样了?

    大家好,我是站长 polarisxu。Go 是一门通用编程语言,Go1.5 实现了自举,也就是说,Go 语言是用它自身实现的。经过十来年的发展,开源界使用 Go 语言实现...

    polarisxu14672021-03-02
  • GolangGo语言 channel如何实现归并排序中的merge函数详解

    Go语言 channel如何实现归并排序中的merge函数详解

    这篇文章主要给大家介绍了关于Go语言 channel如何实现归并排序中merge函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定...

    hezhiming4352020-05-13
  • GolangGolang优雅保持main函数不退出的办法

    Golang优雅保持main函数不退出的办法

    很多时候我们需要让main函数不退出,让它在后台一直执行,下面这篇文章主要给大家介绍了关于Golang优雅保持main函数不退出的相关资料,文中通过实例代码介...

    MiKogy_6572022-07-20