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