golang xorm 自定义日志记录器,使用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数据库
-
// 创建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日志工具
-
var (
-
loggerMap = map[string]*zap.Logger{}
-
loggerMu = &sync.Mutex{}
-
)
-
-
// zap
-
func getZapLog() *zap.Logger {
-
loggerName := "db" // 日志文件名称
-
-
if logger, has := loggerMap[loggerName]; has {
-
return logger
-
} else {
-
loggerMu.Lock()
-
logPath := "./log"
-
logFile := fmt.Sprintf("%s/%s.log", logPath, loggerName)
-
output := zapcore.AddSync(&lumberjack.Logger{
-
Filename: logFile,
-
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 自定义日志记录器
-
// 重点:实现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.使用
-
// 测试
-
pgDb, err := newDb()
-
fmt.Println(err)
-
-
queryInterface, _ := pgDb.SQL("select * from test").QueryInterface()
-
-
fmt.Println(queryInterface)
完整代码
-
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()
-
logPath := "./log"
-
logFile := fmt.Sprintf("%s/%s.log", logPath, loggerName)
-
output := zapcore.AddSync(&lumberjack.Logger{
-
Filename: logFile,
-
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执行一览无遗(附源码) - Go语言中文网 - Golang中文社区
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfibfaj
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
excel下划线不显示怎么办
PHP中文网 06-23 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
photoshop蒙版画笔没反应怎么办
PHP中文网 06-24