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

2022-10-27 20:09:32
目录
1.准备并下载好需要的包2. 连接postgresql数据库3. zap日志工具4.实现xorm 自定义日志记录器5.使用完整代码参考文档

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

    xorm.io/xorm  xorm.io/corego.uber.org/zapgopkg.in/natefinch/lumberjack.v2 >github.com/lib/pq  本文使用postgresql数据库

    2.>
    // 创建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
    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>

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