mirror of https://github.com/jackc/pgx.git
parent
6f90866f58
commit
39676004de
|
@ -7,6 +7,7 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
"unicode/utf8"
|
||||||
|
|
||||||
"github.com/jackc/pgx/v5"
|
"github.com/jackc/pgx/v5"
|
||||||
)
|
)
|
||||||
|
@ -62,6 +63,7 @@ func (f LoggerFunc) Log(ctx context.Context, level LogLevel, msg string, data ma
|
||||||
// LogLevelFromString converts log level string to constant
|
// LogLevelFromString converts log level string to constant
|
||||||
//
|
//
|
||||||
// Valid levels:
|
// Valid levels:
|
||||||
|
//
|
||||||
// trace
|
// trace
|
||||||
// debug
|
// debug
|
||||||
// info
|
// info
|
||||||
|
@ -100,7 +102,13 @@ func logQueryArgs(args []any) []any {
|
||||||
}
|
}
|
||||||
case string:
|
case string:
|
||||||
if len(v) > 64 {
|
if len(v) > 64 {
|
||||||
a = fmt.Sprintf("%s (truncated %d bytes)", v[:64], len(v)-64)
|
var l int = 0
|
||||||
|
for w := 0; l < 64; l += w {
|
||||||
|
_, w = utf8.DecodeRuneInString(v[l:])
|
||||||
|
}
|
||||||
|
if len(v) > l {
|
||||||
|
a = fmt.Sprintf("%s (truncated %d bytes)", v[:l], len(v)-l)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
logArgs = append(logArgs, a)
|
logArgs = append(logArgs, a)
|
||||||
|
|
|
@ -137,6 +137,48 @@ func TestLogQuery(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://github.com/jackc/pgx/issues/1365
|
||||||
|
func TestLogQueryArgsHandlesUTF8(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
logger := &testLogger{}
|
||||||
|
tracer := &tracelog.TraceLog{
|
||||||
|
Logger: logger,
|
||||||
|
LogLevel: tracelog.LogLevelTrace,
|
||||||
|
}
|
||||||
|
|
||||||
|
ctr := defaultConnTestRunner
|
||||||
|
ctr.CreateConfig = func(ctx context.Context, t testing.TB) *pgx.ConnConfig {
|
||||||
|
config := defaultConnTestRunner.CreateConfig(ctx, t)
|
||||||
|
config.Tracer = tracer
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
|
||||||
|
pgxtest.RunWithQueryExecModes(context.Background(), t, ctr, nil, func(ctx context.Context, t testing.TB, conn *pgx.Conn) {
|
||||||
|
logger.logs = logger.logs[0:0] // Clear any logs written when establishing connection
|
||||||
|
|
||||||
|
var s string
|
||||||
|
for i := 0; i < 63; i++ {
|
||||||
|
s += "0"
|
||||||
|
}
|
||||||
|
s += "😊"
|
||||||
|
|
||||||
|
_, err := conn.Exec(ctx, `select $1::text`, s)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Len(t, logger.logs, 1)
|
||||||
|
require.Equal(t, "Query", logger.logs[0].msg)
|
||||||
|
require.Equal(t, tracelog.LogLevelInfo, logger.logs[0].lvl)
|
||||||
|
require.Equal(t, s, logger.logs[0].data["args"].([]any)[0])
|
||||||
|
|
||||||
|
_, err = conn.Exec(ctx, `select $1::text`, s+"000")
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Len(t, logger.logs, 2)
|
||||||
|
require.Equal(t, "Query", logger.logs[1].msg)
|
||||||
|
require.Equal(t, tracelog.LogLevelInfo, logger.logs[1].lvl)
|
||||||
|
require.Equal(t, s+" (truncated 3 bytes)", logger.logs[1].data["args"].([]any)[0])
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestLogCopyFrom(t *testing.T) {
|
func TestLogCopyFrom(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue