• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

golang xorm 自定义日志记录器,使用zap实现日志输出、切割日志

武飞扬头像
一个搬砖的程序猿
帮助1

目录

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

2. 连接postgresql数据库

3. zap日志工具

4.实现xorm 自定义日志记录器

5.使用

完整代码


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

  1. xorm.io/xorm  
  2. xorm.io/core
  3. go.uber.org/zap
  4. gopkg.in/natefinch/lumberjack.v2  用于切割zap
  5. github.com/lib/pq  本文使用postgresql数据库

2. 连接postgresql数据库

  1.  
    // 创建pg数据库连接
  2.  
    func newDb() (*xorm.Engine, error) {
  3.  
    source := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable",
  4.  
    "127.0.0.1", 5432, "postgres", "root", "postgres")
  5.  
     
  6.  
    engine, err := xorm.NewEngine("postgres", source)
  7.  
    if err != nil {
  8.  
    return nil, err
  9.  
    }
  10.  
     
  11.  
    // 连接池中最大连接数
  12.  
    engine.SetMaxOpenConns(100)
  13.  
    // 连接池中最大空闲连接数
  14.  
    engine.SetMaxIdleConns(10)
  15.  
    // 单个连接最大存活时间(单位:秒)
  16.  
    engine.SetConnMaxLifetime(10)
  17.  
    engine.ShowSQL(true)
  18.  
     
  19.  
    // 输出日志 终点部分使用自定义日志记录器
  20.  
    engine.SetLogger(&customXormLogger{
  21.  
    level: xormlog.LOG_INFO,
  22.  
    showSQL: true,
  23.  
    })
  24.  
     
  25.  
    return engine, nil
  26.  
    }
学新通

3. zap日志工具

  1.  
    var (
  2.  
    loggerMap = map[string]*zap.Logger{}
  3.  
    loggerMu = &sync.Mutex{}
  4.  
    )
  5.  
     
  6.  
    // zap
  7.  
    func getZapLog() *zap.Logger {
  8.  
    loggerName := "db" // 日志文件名称
  9.  
     
  10.  
    if logger, has := loggerMap[loggerName]; has {
  11.  
    return logger
  12.  
    } else {
  13.  
    loggerMu.Lock()
  14.  
    logPath := "./log"
  15.  
    logFile := fmt.Sprintf("%s/%s.log", logPath, loggerName)
  16.  
    output := zapcore.AddSync(&lumberjack.Logger{
  17.  
    Filename: logFile,
  18.  
    MaxSize: 100, // 日志文件最大容量(单位:MB),超过容量,文件会自动分割
  19.  
    MaxBackups: 1, // 保留的日志天数(单位:天)
  20.  
    MaxAge: 10, // 保留的日志文件个数,文件数量超过该值,最旧的文件会被删除
  21.  
    })
  22.  
     
  23.  
    // 如果需要可以输出当控制台
  24.  
    //output = zapcore.NewMultiWriteSyncer(output, os.Stdout)
  25.  
    level := zapcore.DebugLevel
  26.  
    _ = level.Set("info") // 设置日志级别 debug info warn error fatal (日志级别从大到小)
  27.  
     
  28.  
    core := zapcore.NewCore(
  29.  
    zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()), // 设置日志输出格式 这块可以自定义
  30.  
    output,
  31.  
    zap.NewAtomicLevelAt(level),
  32.  
    )
  33.  
    newLogger := zap.New(core, zap.AddStacktrace(zapcore.ErrorLevel))
  34.  
     
  35.  
    loggerMap[loggerName] = newLogger
  36.  
    loggerMu.Unlock()
  37.  
    return newLogger
  38.  
    }
  39.  
    }
学新通

4.实现xorm 自定义日志记录器

  1.  
    // 重点:实现xormLogger接口 自定义记录器
  2.  
    type customXormLogger struct {
  3.  
    level xormlog.LogLevel
  4.  
    showSQL bool
  5.  
    }
  6.  
     
  7.  
    var _ xormlog.Logger = &customXormLogger{}
  8.  
     
  9.  
    func (c *customXormLogger) Debug(v ...interface{}) {
  10.  
    if c.level <= xormlog.LOG_DEBUG {
  11.  
    fmt.Println(v...)
  12.  
    }
  13.  
    return
  14.  
    }
  15.  
     
  16.  
    func (c *customXormLogger) Debugf(format string, v ...interface{}) {
  17.  
    if c.level <= xormlog.LOG_DEBUG {
  18.  
    getZapLog().Debug(fmt.Sprint(v...))
  19.  
    }
  20.  
    return
  21.  
    }
  22.  
     
  23.  
    func (c *customXormLogger) Error(v ...interface{}) {
  24.  
    if c.level <= xormlog.LOG_ERR {
  25.  
    fmt.Println(v...)
  26.  
    }
  27.  
    return
  28.  
    }
  29.  
     
  30.  
    func (c *customXormLogger) Errorf(format string, v ...interface{}) {
  31.  
    if c.level <= xormlog.LOG_ERR {
  32.  
    getZapLog().Error(fmt.Sprint(v...))
  33.  
    }
  34.  
    return
  35.  
    }
  36.  
     
  37.  
    func (c *customXormLogger) Info(v ...interface{}) {
  38.  
    if c.level <= xormlog.LOG_INFO {
  39.  
    fmt.Println(v...)
  40.  
    }
  41.  
    return
  42.  
    }
  43.  
     
  44.  
    func (c *customXormLogger) Infof(format string, v ...interface{}) {
  45.  
    if c.level <= xormlog.LOG_INFO {
  46.  
    getZapLog().Info(fmt.Sprint(v...))
  47.  
    }
  48.  
    return
  49.  
    }
  50.  
     
  51.  
    func (c *customXormLogger) Warn(v ...interface{}) {
  52.  
    if c.level <= xormlog.LOG_WARNING {
  53.  
    fmt.Println(v...)
  54.  
    }
  55.  
    return
  56.  
    }
  57.  
     
  58.  
    func (c *customXormLogger) Warnf(format string, v ...interface{}) {
  59.  
    if c.level <= xormlog.LOG_WARNING {
  60.  
    getZapLog().Warn(fmt.Sprint(v...))
  61.  
    }
  62.  
    return
  63.  
    }
  64.  
     
  65.  
    func (c *customXormLogger) Level() xormlog.LogLevel {
  66.  
    return c.level
  67.  
    }
  68.  
     
  69.  
    func (c *customXormLogger) SetLevel(l xormlog.LogLevel) {
  70.  
    c.level = l
  71.  
    return
  72.  
    }
  73.  
     
  74.  
    func (c *customXormLogger) ShowSQL(show ...bool) {
  75.  
    if len(show) == 0 {
  76.  
    c.showSQL = true
  77.  
    return
  78.  
    }
  79.  
    c.showSQL = show[0]
  80.  
    }
  81.  
     
  82.  
    func (c *customXormLogger) IsShowSQL() bool {
  83.  
    return c.showSQL
  84.  
    }
学新通

5.使用

  1.  
    // 测试
  2.  
    pgDb, err := newDb()
  3.  
    fmt.Println(err)
  4.  
     
  5.  
    queryInterface, _ := pgDb.SQL("select * from test").QueryInterface()
  6.  
     
  7.  
    fmt.Println(queryInterface)

完整代码

  1.  
    package main
  2.  
     
  3.  
    import (
  4.  
    "fmt"
  5.  
    _ "github.com/lib/pq"
  6.  
    "go.uber.org/zap"
  7.  
    "go.uber.org/zap/zapcore"
  8.  
    "gopkg.in/natefinch/lumberjack.v2"
  9.  
    "sync"
  10.  
    "xorm.io/xorm"
  11.  
    xormlog "xorm.io/xorm/log"
  12.  
    )
  13.  
     
  14.  
    var (
  15.  
    loggerMap = map[string]*zap.Logger{}
  16.  
    loggerMu = &sync.Mutex{}
  17.  
    )
  18.  
     
  19.  
    // 创建pg数据库连接
  20.  
    func newDb() (*xorm.Engine, error) {
  21.  
    source := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable",
  22.  
    "127.0.0.1", 5432, "postgres", "root", "postgres")
  23.  
     
  24.  
    engine, err := xorm.NewEngine("postgres", source)
  25.  
    if err != nil {
  26.  
    return nil, err
  27.  
    }
  28.  
     
  29.  
    // 连接池中最大连接数
  30.  
    engine.SetMaxOpenConns(100)
  31.  
    // 连接池中最大空闲连接数
  32.  
    engine.SetMaxIdleConns(10)
  33.  
    // 单个连接最大存活时间(单位:秒)
  34.  
    engine.SetConnMaxLifetime(10)
  35.  
    engine.ShowSQL(true)
  36.  
     
  37.  
    // 输出日志 终点部分使用自定义日志记录器
  38.  
    engine.SetLogger(&customXormLogger{
  39.  
    level: xormlog.LOG_INFO,
  40.  
    showSQL: true,
  41.  
    })
  42.  
     
  43.  
    return engine, nil
  44.  
    }
  45.  
     
  46.  
    // zap
  47.  
    func getZapLog() *zap.Logger {
  48.  
    loggerName := "db" // 日志文件名称
  49.  
     
  50.  
    if logger, has := loggerMap[loggerName]; has {
  51.  
    return logger
  52.  
    } else {
  53.  
    loggerMu.Lock()
  54.  
    logPath := "./log"
  55.  
    logFile := fmt.Sprintf("%s/%s.log", logPath, loggerName)
  56.  
    output := zapcore.AddSync(&lumberjack.Logger{
  57.  
    Filename: logFile,
  58.  
    MaxSize: 100, // 日志文件最大容量(单位:MB),超过容量,文件会自动分割
  59.  
    MaxBackups: 1, // 保留的日志天数(单位:天)
  60.  
    MaxAge: 10, // 保留的日志文件个数,文件数量超过该值,最旧的文件会被删除
  61.  
    })
  62.  
     
  63.  
    // 如果需要可以输出当控制台
  64.  
    //output = zapcore.NewMultiWriteSyncer(output, os.Stdout)
  65.  
    level := zapcore.DebugLevel
  66.  
    _ = level.Set("info") // 设置日志级别 debug info warn error fatal (日志级别从大到小)
  67.  
     
  68.  
    core := zapcore.NewCore(
  69.  
    zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()), // 设置日志输出格式 这块可以自定义
  70.  
    output,
  71.  
    zap.NewAtomicLevelAt(level),
  72.  
    )
  73.  
    newLogger := zap.New(core, zap.AddStacktrace(zapcore.ErrorLevel))
  74.  
     
  75.  
    loggerMap[loggerName] = newLogger
  76.  
    loggerMu.Unlock()
  77.  
    return newLogger
  78.  
    }
  79.  
    }
  80.  
     
  81.  
    // 重点:实现xormLogger接口 自定义记录器
  82.  
    type customXormLogger struct {
  83.  
    level xormlog.LogLevel
  84.  
    showSQL bool
  85.  
    }
  86.  
     
  87.  
    var _ xormlog.Logger = &customXormLogger{}
  88.  
     
  89.  
    func (c *customXormLogger) Debug(v ...interface{}) {
  90.  
    if c.level <= xormlog.LOG_DEBUG {
  91.  
    fmt.Println(v...)
  92.  
    }
  93.  
    return
  94.  
    }
  95.  
     
  96.  
    func (c *customXormLogger) Debugf(format string, v ...interface{}) {
  97.  
    if c.level <= xormlog.LOG_DEBUG {
  98.  
    getZapLog().Debug(fmt.Sprint(v...))
  99.  
    }
  100.  
    return
  101.  
    }
  102.  
     
  103.  
    func (c *customXormLogger) Error(v ...interface{}) {
  104.  
    if c.level <= xormlog.LOG_ERR {
  105.  
    fmt.Println(v...)
  106.  
    }
  107.  
    return
  108.  
    }
  109.  
     
  110.  
    func (c *customXormLogger) Errorf(format string, v ...interface{}) {
  111.  
    if c.level <= xormlog.LOG_ERR {
  112.  
    getZapLog().Error(fmt.Sprint(v...))
  113.  
    }
  114.  
    return
  115.  
    }
  116.  
     
  117.  
    func (c *customXormLogger) Info(v ...interface{}) {
  118.  
    if c.level <= xormlog.LOG_INFO {
  119.  
    fmt.Println(v...)
  120.  
    }
  121.  
    return
  122.  
    }
  123.  
     
  124.  
    func (c *customXormLogger) Infof(format string, v ...interface{}) {
  125.  
    if c.level <= xormlog.LOG_INFO {
  126.  
    getZapLog().Info(fmt.Sprint(v...))
  127.  
    }
  128.  
    return
  129.  
    }
  130.  
     
  131.  
    func (c *customXormLogger) Warn(v ...interface{}) {
  132.  
    if c.level <= xormlog.LOG_WARNING {
  133.  
    fmt.Println(v...)
  134.  
    }
  135.  
    return
  136.  
    }
  137.  
     
  138.  
    func (c *customXormLogger) Warnf(format string, v ...interface{}) {
  139.  
    if c.level <= xormlog.LOG_WARNING {
  140.  
    getZapLog().Warn(fmt.Sprint(v...))
  141.  
    }
  142.  
    return
  143.  
    }
  144.  
     
  145.  
    func (c *customXormLogger) Level() xormlog.LogLevel {
  146.  
    return c.level
  147.  
    }
  148.  
     
  149.  
    func (c *customXormLogger) SetLevel(l xormlog.LogLevel) {
  150.  
    c.level = l
  151.  
    return
  152.  
    }
  153.  
     
  154.  
    func (c *customXormLogger) ShowSQL(show ...bool) {
  155.  
    if len(show) == 0 {
  156.  
    c.showSQL = true
  157.  
    return
  158.  
    }
  159.  
    c.showSQL = show[0]
  160.  
    }
  161.  
     
  162.  
    func (c *customXormLogger) IsShowSQL() bool {
  163.  
    return c.showSQL
  164.  
    }
  165.  
     
  166.  
    func main() {
  167.  
    // 测试
  168.  
    pgDb, err := newDb()
  169.  
    fmt.Println(err)
  170.  
     
  171.  
    queryInterface, _ := pgDb.SQL("select * from test").QueryInterface()
  172.  
     
  173.  
    fmt.Println(queryInterface)
  174.  
    }
学新通

参考文档

Golang XORM搭配OpenTracing Jaeger链路监控让SQL执行一览无遗(附源码) - Go语言中文网 - Golang中文社区

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfibfaj
系列文章
更多 icon
同类精品
更多 icon
继续加载