golang xorm 自定义日志记录器之使用zap实现日志输出、切割日志(最新)
短信预约 -IT技能 免费直播动态提醒
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日志工具
// 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 自定义日志记录器
// 重点:实现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()
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日志内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341