如果我使用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
}请告诉我如何记录我的查询?
发布于 2020-10-25 23:42:39
我最终得到了以下解决方案:
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
}发布于 2020-10-24 02:29:29
只需在连接的ConnConfig属性中设置记录器:
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)
}
conn.Config().Logger = myLogger根据您使用的记录器,有许多适配器(例如,https://github.com/jackc/pgx/blob/master/log/zapadapter/adapter.go)
然后在你的记录器中,只需要用"sql“键来记录:
func (m *myLogger) Log(ctx context.Context, level pgx.LogLevel, msg string, data map[string]interface{}) {
if sql, ok := data["sql"]; ok {
m.Log("Executing SQL: %s", sql)
}
}发布于 2021-09-17 04:58:37
完全归功于@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
}上面的代码是可以的,但我将在这里讨论两点
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)logrusadapter不再有效:
import (
"github.com/jackc/pgx/log/logrusadapter"
)目前正在运行:
import (
"github.com/jackc/pgx/v4/log/logrusadapter"
)好的,它似乎是在2021年的v4中,请确保在未来导入之前检查您的版本
你不需要重命名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帮助我找到了一个好的日志系统
https://stackoverflow.com/questions/64504879
复制相似问题