文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-04-02 19:55

关注

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

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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯