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

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

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日志内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • golang有用的库及工具 之 zap.Logger包的使用指南

    zap.Logger 是go语言中相对日志库中性能最高的.那么如何开始使用? 不多说直接上代码: import ( "encoding/json" "fmt" "log" "go.uber.org/zap" "go.uber.org/zap/zapcore" ) var Logger *zap.Logger func InitLogger() { // 日志地址 "out.log" 自定

  • golang默认Logger日志库在项目中使用Zap日志库

    目录 在Go语言项目中使用Zap日志库介绍 默认的Go Logger日志库 实现Go Logger 设置Logger 使用Logger Logger的运行 Go Logger的优势和劣势 优势 劣势 Uber-go Zap日志库 为什么选择Uber-go zap 安装 配置Zap Logger Logger Sugared Logger 定制logger 将日志写入文件而不是终端 将JSON Encoder更改为普通的Log Encoder 更改时间编码并添加调用者详细信息 使用Lumberja

  • 深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)

    日志处理经常有以下几个需求: 1.不同级别的日志输出到不同的日志文件中. 2.日志文件按照文件大小或日期进行切割存储,以避免单一日志文件过大. 3.日志使用简单方便,一次定义全局使用. 建议使用使用Uber-go的Zap Logger,大神李文周大博客已经说的非常明确了,请先参考李老师的博客: https://www.liwenzhou.com/posts/Go/zap/ 问题二和问题三需要补充描述: 一.日志按照级别分文件切割存储 1.1 首先实现两个判断日志等级的interface info

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

    目录 1.准备并下载好需要的包 2. 连接postgresql数据库 3. zap日志工具 4.实现xorm 自定义日志记录器 5.使用 完整代码 参考文档 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

  • .Net Core日志记录之自定义日志组件

    一.前言 回顾:日志记录之日志核心要素揭秘 在上一篇中,我们通过学习了解在.net core 中内置的日志记录中的几大核心要素,在日志工厂记录器(ILoggerFactory)中实现将日志记录提供器(ILoggerProvider)对象都可以集成到Logger对象组合中,这样的话,我们就可以通过基于ILoggerProvider自定义日志记录程序集成到Logger中,再创建写日志定义Ilogger,自定义日志记录器实现日志的输出方式,这样实现自定义日志记录工具. 在这个过程中,日志记录器ILog

  • .Net Core日志记录之日志记录器

    目录 一.前言 二.说明 三.开始 3.1 日志记录器工厂 3.1.1 ILoggerFactory 接口 3.1.2 LoggerFactory 实现 CreateLogger 3.2日志记录提供器 3.2.1 ILoggerProvider 接口 3.3 日志记录器 3.3.1 ILogger 接口 3.3.2 Logger 实现 四.总结 一.前言 回顾:日志记录之日志配置揭秘 在上一篇中,我们已经了解了内置系统的默认配置和自定义配置的方式,在学习了配置的基础上,我们进一步的对日志在程序中

  • .Net Core日志记录之第三方框架Serilog

    一.前言 对内置日志系统的整体实现进行了介绍之后,可以通过使用内置记录器来实现日志的输出路径.而在实际项目开发中,使用第三方日志框架(如: Log4Net.NLog.Loggr.Serilog.Sentry 等)来记录也是非常多的.首先一般基础的内置日志记录器在第三方日志框架中都有实现,然后第三方日志框架在功能上更加强大和丰富,能满足我们更多的项目分析和诊断的需求. 所以在这一篇中,我们将介绍第三方日志记录提供程序——Serilog 二.回顾 系统内置日志系列: 1. 基于.NetCore3.1

  • mysql 开启慢查询 如何打开mysql的慢查询日志记录

    mysql慢查询日志对于跟踪有问题的查询非常有用,可以分析出当前程序里有很耗费资源的sql语句,那如何打开mysql的慢查询日志记录呢? 其实打开mysql的慢查询日志很简单,只需要在mysql的配置文件里(windows系统是my.ini,linux系统是my.cnf)的[mysqld]下面加上如下代码: 复制代码 代码如下: log-slow-queries=/var/lib/mysql/slowquery.log long_query_time=2 注: log-slow-queries

  • Python 程序员必须掌握的日志记录

    写在之前 在我们的现实生活中,「日志记录」其实是一件非常重要的事情,比如银行的转账记录,汽车的行车记录仪记录行驶过程中的一切,如果出现了什么问题,我们可以通过「日志记录」来搞清楚到底发生了什么事情. 除了在生活中,在日常的系统开发以及调试等过程中,记录日志同样是一件很重要的事情.很多编程初学者并没有「记录日志」的习惯,认为记录日志是一件可有可无的事情,出现问题的时候只要使用 print 函数打印一下程序的中间结果即可,真是 too young too naive.只是 print 的话对于简单的

  • 使用Log4net进行日志记录

    首先说说为什么要进行日志记录.在一个完整的程序系统里面,日志系统是一个非常重要的功能组成部分.它可以记录下系统所产生的所有行为,并按照某种规范表达出来.我们可以使用日志系统所记录的信息为系统进行排错,优化系统的性能,或者根据这些信息调整系统的行为. Log4net是一个很著名的开源的日志记录组件.官方网址为:http://logging.apache.org/log4net/ ,使用Log4net能够很简单的为我们的程序添加日志记录功能.下面我们先通过一个网站例子来说明如何在.net中使用log

  • golang xorm日志写入文件中的操作

    golang访问数据库记录SQL语句: 使用的包为: 1:github.com/arthurkiller/rollingwriter //写入日志包 2: github.com/go-xorm/xorm //xorm包 具体实现为: package main import ( "time" "github.com/arthurkiller/rollingwriter" _ "github.com/go-sql-driver/mysql" &quo

  • php基于自定义函数记录log日志方法

    本文实例讲述了php基于自定义函数记录log日志方法.分享给大家供大家参考,具体如下: /** * 记录错误日志 * @param 日志内容 $res */ function save_log($res) { $err_date = date("Ym", time()); //$address = '/var/log/error'; $address = './error'; if (!is_dir($address)) { mkdir($address, 0700, true); }

  • springMVC自定义注解,用AOP来实现日志记录的方法

    需求背景 最近的一个项目,在项目基本完工的阶段,客户提出要将所有业务操作的日志记录到数据库中,并且要提取一些业务的关键信息(比如交易单号)体现在日志中. 为了保证工期,在查阅了资料以后,决定用AOP+自定义注解的方式来完成这个需求. 准备工作 自定义注解需要依赖的jar包有 aspectjrt-XXX.jar ,aspectjweaver-XXX.jar,XXX代表版本号. 自定义注解 在项目下单独建立了一个log包,来存放日志相关的内容 **.common.log.annotation //自

随机推荐