Skip to content

Commit 6be4431

Browse files
committed
Rebased and updated dependencies.
1 parent 32bfee4 commit 6be4431

File tree

4 files changed

+61
-48
lines changed

4 files changed

+61
-48
lines changed

cmd/root.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -579,7 +579,7 @@ func loadConfig(c *Command, args []string, opts []Option) error {
579579

580580
// Handle logger separately from config
581581
if c.conf.StructuredLogs {
582-
c.logger, c.cleanup = log.NewStructuredLogger(c.conf.Quiet)
582+
c.logger = log.NewStructuredLogger(c.conf.Quiet)
583583
}
584584

585585
if c.conf.Quiet {

go.mod

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ require (
1616
github.com/spf13/pflag v1.0.6
1717
github.com/spf13/viper v1.20.1
1818
go.opencensus.io v0.24.0
19-
go.uber.org/zap v1.27.0
2019
golang.org/x/oauth2 v0.30.0
2120
golang.org/x/sys v0.34.0
2221
google.golang.org/api v0.241.0

go.sum

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1230,16 +1230,12 @@ go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
12301230
go.uber.org/automaxprocs v1.5.1/go.mod h1:BF4eumQw0P9GtnuxxovUd06vwm1o18oMzFtK66vU6XU=
12311231
go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
12321232
go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
1233-
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
1234-
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
12351233
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
12361234
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
12371235
go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
12381236
go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
12391237
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
12401238
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
1241-
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
1242-
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
12431239
golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
12441240
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
12451241
golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=

internal/log/log.go

Lines changed: 60 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -15,36 +15,42 @@
1515
package log
1616

1717
import (
18+
"fmt"
1819
"io"
1920
llog "log"
21+
"log/slog"
2022
"os"
23+
"time"
2124

2225
"github.com/GoogleCloudPlatform/cloud-sql-proxy/v2/cloudsql"
23-
"go.uber.org/zap"
24-
"go.uber.org/zap/zapcore"
26+
)
27+
28+
const (
29+
googLvlKey = "severity"
30+
googMsgKey = "message"
31+
googSourceKey = "sourceLocation"
32+
googTimeKey = "timestamp"
2533
)
2634

2735
// StdLogger is the standard logger that distinguishes between info and error
2836
// logs.
2937
type StdLogger struct {
30-
infoLog *llog.Logger
31-
debugLog *llog.Logger
32-
errLog *llog.Logger
38+
stdLog *llog.Logger
39+
errLog *llog.Logger
3340
}
3441

3542
// NewStdLogger create a Logger that uses out and err for informational and
3643
// error messages.
3744
func NewStdLogger(out, err io.Writer) cloudsql.Logger {
3845
return &StdLogger{
39-
infoLog: llog.New(out, "", llog.LstdFlags),
40-
debugLog: llog.New(out, "", llog.LstdFlags),
41-
errLog: llog.New(err, "", llog.LstdFlags),
46+
stdLog: llog.New(out, "", llog.LstdFlags),
47+
errLog: llog.New(err, "", llog.LstdFlags),
4248
}
4349
}
4450

4551
// Infof logs informational messages
4652
func (l *StdLogger) Infof(format string, v ...interface{}) {
47-
l.infoLog.Printf(format, v...)
53+
l.stdLog.Printf(format, v...)
4854
}
4955

5056
// Errorf logs error messages
@@ -54,61 +60,73 @@ func (l *StdLogger) Errorf(format string, v ...interface{}) {
5460

5561
// Debugf logs debug messages
5662
func (l *StdLogger) Debugf(format string, v ...interface{}) {
57-
l.debugLog.Printf(format, v...)
63+
l.stdLog.Printf(format, v...)
5864
}
5965

6066
// StructuredLogger writes log messages in JSON.
6167
type StructuredLogger struct {
62-
logger *zap.SugaredLogger
68+
stdLog *slog.Logger
69+
errLog *slog.Logger
6370
}
6471

6572
// Infof logs informational messages
6673
func (l *StructuredLogger) Infof(format string, v ...interface{}) {
67-
l.logger.Infof(format, v...)
74+
l.stdLog.Info(fmt.Sprintf(format, v...))
6875
}
6976

7077
// Errorf logs error messages
7178
func (l *StructuredLogger) Errorf(format string, v ...interface{}) {
72-
l.logger.Errorf(format, v...)
79+
l.errLog.Error(fmt.Sprintf(format, v...))
7380
}
7481

7582
// Debugf logs debug messages
7683
func (l *StructuredLogger) Debugf(format string, v ...interface{}) {
77-
l.logger.Debugf(format, v...)
84+
l.stdLog.Debug(fmt.Sprintf(format, v...))
7885
}
7986

8087
// NewStructuredLogger creates a Logger that logs messages using JSON.
81-
func NewStructuredLogger(quiet bool) (cloudsql.Logger, func() error) {
82-
// Configure structured logs to adhere to LogEntry format
83-
// https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry
84-
c := zap.NewProductionEncoderConfig()
85-
c.LevelKey = "severity"
86-
c.MessageKey = "message"
87-
c.TimeKey = "timestamp"
88-
c.EncodeLevel = zapcore.CapitalLevelEncoder
89-
c.EncodeTime = zapcore.ISO8601TimeEncoder
90-
91-
enc := zapcore.NewJSONEncoder(c)
92-
93-
var syncer zapcore.WriteSyncer
94-
// quiet disables writing to the info log
88+
func NewStructuredLogger(quiet bool) cloudsql.Logger {
89+
var infoHandler, errorHandler slog.Handler
9590
if quiet {
96-
syncer = zapcore.AddSync(io.Discard)
91+
infoHandler = slog.DiscardHandler
9792
} else {
98-
syncer = zapcore.Lock(os.Stdout)
93+
infoHandler = slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
94+
Level: slog.LevelDebug,
95+
ReplaceAttr: replaceAttr,
96+
})
9997
}
100-
core := zapcore.NewTee(
101-
zapcore.NewCore(enc, syncer, zap.LevelEnablerFunc(func(l zapcore.Level) bool {
102-
// Anything below error, goes to the info log.
103-
return l < zapcore.ErrorLevel
104-
})),
105-
zapcore.NewCore(enc, zapcore.Lock(os.Stderr), zap.LevelEnablerFunc(func(l zapcore.Level) bool {
106-
// Anything at error or higher goes to the error log.
107-
return l >= zapcore.ErrorLevel
108-
})),
109-
)
98+
errorHandler = slog.NewJSONHandler(os.Stderr, &slog.HandlerOptions{
99+
Level: slog.LevelError,
100+
ReplaceAttr: replaceAttr,
101+
})
102+
110103
l := &StructuredLogger{
111-
logger: zap.New(core).Sugar(),
104+
stdLog: slog.New(infoHandler),
105+
errLog: slog.New(errorHandler),
106+
}
107+
return l
108+
}
109+
110+
// replaceAttr remaps default Go logging keys to adhere to LogEntry format
111+
// https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry
112+
func replaceAttr(groups []string, a slog.Attr) slog.Attr {
113+
if groups == nil {
114+
if a.Key == slog.LevelKey {
115+
a.Key = googLvlKey
116+
return a
117+
} else if a.Key == slog.MessageKey {
118+
a.Key = googMsgKey
119+
return a
120+
} else if a.Key == slog.SourceKey {
121+
a.Key = googSourceKey
122+
return a
123+
} else if a.Key == slog.TimeKey {
124+
a.Key = googTimeKey
125+
if a.Value.Kind() == slog.KindTime {
126+
a.Value = slog.StringValue(a.Value.Time().Format(time.RFC3339))
127+
}
128+
return a
129+
}
112130
}
113-
return l, l.logger.Sync
131+
return a
114132
}

0 commit comments

Comments
 (0)