我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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日志工具

// 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

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何使用自定义Json注解实现输出日志字段脱敏

这篇文章给大家分享的是有关如何使用自定义Json注解实现输出日志字段脱敏的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。自定义Json注解实现输出日志字段脱敏背景在日志输出的时候,有时会输出一些用户的敏感信息,如手
2023-06-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录