【问题标题】:How to log queries with pgx?如何使用 pgx 记录查询?
【发布时间】:2021-02-06 19:21:31
【问题描述】:

如果我使用 pgx 池,我找不到如何记录 sql 查询的文档。例如,我创建了这样的池:

func DB() *pgxpool.Pool {
    connStr := os.Getenv("DATABASE_URL")
    conn, err := pgxpool.Connect(context.Background(), connStr)
    if err != nil {
        fmt.Fprintf(os.Stderr, "Unable to connect to database: %v\n", err)
        os.Exit(1)
    }
    return conn
}

那么请告诉我如何记录我的查询?

【问题讨论】:

  • 与记录其他任何内容的方式相同:通过调用记录方法。看起来你正在这样做。您要解决的问题是什么?

标签: go pgx


【解决方案1】:

我最终得到了以下解决方案:

func DB() *pgxpool.Pool {
    config, err := pgxpool.ParseConfig(connStr)
    if err != nil {
        fmt.Fprintf(os.Stderr, "Unable to parse config: %v\n", err)
        os.Exit(1)
    }
    looger := &log.Logger{
        Out:          os.Stderr,
        Formatter:    new(log.JSONFormatter),
        Hooks:        make(log.LevelHooks),
        Level:        log.InfoLevel,
        ExitFunc:     os.Exit,
        ReportCaller: false,
    }
    config.ConnConfig.Logger = logrusadapter.NewLogger(looger)
    conn, err := pgxpool.ConnectConfig(context.Background(), config)
    if err != nil {
        fmt.Fprintf(os.Stderr, "Unable to connect to database: %v\n", err)
        os.Exit(1)
    }
    return conn
}

【讨论】:

    【解决方案2】:

    完整的功劳归于@mystdeim,他在上面回答了。

    抄袭原因:进口说明清楚

    为什么不只是评论?:我没有 50 个代表

    开始吧

    原答案:

    func DB() *pgxpool.Pool {
    config, err := pgxpool.ParseConfig(connStr)
    if err != nil {
        fmt.Fprintf(os.Stderr, "Unable to parse config: %v\n", err)
        os.Exit(1)
    }
    looger := &log.Logger{
        Out:          os.Stderr,
        Formatter:    new(log.JSONFormatter),
        Hooks:        make(log.LevelHooks),
        Level:        log.InfoLevel,
        ExitFunc:     os.Exit,
        ReportCaller: false,
    }
    config.ConnConfig.Logger = logrusadapter.NewLogger(looger)
    conn, err := pgxpool.ConnectConfig(context.Background(), config)
    if err != nil {
        fmt.Fprintf(os.Stderr, "Unable to connect to database: %v\n", err)
        os.Exit(1)
    }
    return conn
    }
    

    上面的代码是可以的,但是我这里讲两点

    1. 导入:log

    log 的导入令人困惑

    让我们仔细看看

        looger := &log.Logger{
        Out:          os.Stderr,
        Formatter:    new(log.JSONFormatter),
        Hooks:        make(log.LevelHooks),
        Level:        log.InfoLevel,
        ExitFunc:     os.Exit,
        ReportCaller: false,
    }
    config.ConnConfig.Logger = logrusadapter.NewLogger(looger)
    

    首先,让我们谈谈log 包导入。假设从最后一行开始,他使用的是logrus

    所以

    import (
    "log"
    )
    

    是不可能的,因为你会失去logrus的力量。

    现在,如果您将 logrus 重命名为 log 使用

    import (
    log "github.com/sirupsen/logrus"
    )
    

    它会产生另一个错误:

    LstdFlags not declared by package logrus (UndeclaredImportedName)
    
    1. 导入logrusadapter

    不再有效:

        import (
    "github.com/jackc/pgx/log/logrusadapter"
    )
    

    目前正在工作:

            import (
    "github.com/jackc/pgx/v4/log/logrusadapter"
    )
    

    [嗯,好像是2021年的v4,以后导入前一定要检查你的版本]

    1. 我修改后的解决方案

    您无需重命名logrus,保持原样。

                    import (
     "github.com/sirupsen/logrus"
     "github.com/jackc/pgx/v4/pgxpool"
    "github.com/jackc/pgx/v4/log/logrusadapter"
    
    )
    

    最后

    func DB() *pgxpool.Pool {
        config, err := pgxpool.ParseConfig(connStr)
        if err != nil {
            fmt.Fprintf(os.Stderr, "Unable to parse config: %v\n", err)
            os.Exit(1)
        }
        logrusLogger := &logrus.Logger{
        Out:          os.Stderr,
        Formatter:    new(logrus.JSONFormatter),
        Hooks:        make(logrus.LevelHooks),
        Level:        logrus.InfoLevel,
        ExitFunc:     os.Exit,
        ReportCaller: false,
       }
        config.ConnConfig.Logger = logrusadapter.NewLogger(logrusLogger)
        conn, err := pgxpool.ConnectConfig(context.Background(), config)
        if err != nil {
            fmt.Fprintf(os.Stderr, "Unable to connect to database: %v\n", err)
            os.Exit(1)
        }
        return conn
    }
    

    非常感谢@mystdeim 帮助我找到了一个好的日志系统

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-01
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多