Skip to content

Commit d4ca8c3

Browse files
author
e_forbes
committed
migrate all bar gitlab-shell to new slog labkit setup
This change utilises the slog.SetDefault(logger) call to ensure that any subsequent log emissions using slog will use the LabKit configured setup. This is really quite useful as it allows us to avoid having to plumb through the logger into every component within our system. Whilst this would have been a nicer approach when it comes to testing, pragmatically, that would have involved a significant code change. I've tried to walk through that process with other MRs but end up with a few hundred lines of a delta which I feel is much too risky to roll out alongside a logger change. Migrating to this first, and then cleaning up the service to follow cleaner architectural patterns feels like a less risky approach.
1 parent 746b21f commit d4ca8c3

7 files changed

Lines changed: 45 additions & 35 deletions

File tree

cmd/gitlab-shell-authorized-keys-check/main.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,10 @@ func execute(readWriter *readwriter.ReadWriter) (int, error) {
5454
return exitCodeFailure, fmt.Errorf("failed to read config, exiting")
5555
}
5656

57-
logCloser := logger.Configure(config)
58-
defer func() { _ = logCloser.Close() }()
57+
logCloser := logger.ConfigureLogger(config)
58+
if logCloser != nil {
59+
defer logCloser.Close() //nolint:errcheck
60+
}
5961

6062
cmd, err := cmd.New(os.Args[1:], config, readWriter)
6163
if err != nil {

cmd/gitlab-shell-authorized-principals-check/main.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,10 @@ func run() int {
4646
return 1
4747
}
4848

49-
logCloser := logger.Configure(config)
50-
defer logCloser.Close() //nolint:errcheck
49+
logCloser := logger.ConfigureLogger(config)
50+
if logCloser != nil {
51+
defer logCloser.Close() //nolint:errcheck
52+
}
5153

5254
cmd, err := cmd.New(os.Args[1:], config, readWriter)
5355
if err != nil {

cmd/gitlab-shell-check/main.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,10 @@ func run() int {
5151
return code
5252
}
5353

54-
logCloser := logger.Configure(config)
55-
defer logCloser.Close() //nolint:errcheck
54+
logCloser := logger.ConfigureLogger(config)
55+
if logCloser != nil {
56+
defer logCloser.Close() //nolint:errcheck
57+
}
5658

5759
cmd, err := checkCmd.New(config, readWriter)
5860
if code := exitOnError(err, "Failed to create command"); code != 0 {

cmd/gitlab-sshd/main.go

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -59,26 +59,19 @@ func main() {
5959
))
6060
}
6161
}
62-
log, logCloser, err := logger.ConfigureLogger(cfg)
63-
if err != nil {
64-
log.ErrorContext(ctx, "failed to log to file, reverting to stderr", slog.String(fields.ErrorMessage, err.Error()))
65-
} else {
66-
// nolint
67-
defer func() {
68-
if err = logCloser.Close(); err != nil {
69-
log.ErrorContext(ctx, "failed to close log file", slog.String(fields.ErrorMessage, err.Error()))
70-
}
71-
}()
62+
logCloser := logger.ConfigureLogger(cfg)
63+
if logCloser != nil {
64+
defer logCloser.Close() //nolint:errcheck
7265
}
73-
log.InfoContext(ctx, "gitlab-sshd starting up...")
66+
slog.InfoContext(ctx, "gitlab-sshd starting up...")
7467

7568
overrideConfigFromEnvironment(cfg)
7669
if err := isConfigSane(cfg); err != nil {
7770
ctx = v2log.WithFields(ctx, slog.String(fields.ErrorMessage, err.Error()))
7871
if *configDir == "" {
79-
log.ErrorContext(ctx, "no config-dir provided, using only environment variables")
72+
slog.ErrorContext(ctx, "no config-dir provided, using only environment variables")
8073
} else {
81-
log.ErrorContext(ctx, "configuration error")
74+
slog.ErrorContext(ctx, "configuration error")
8275
}
8376
}
8477

@@ -90,14 +83,14 @@ func main() {
9083

9184
server, err := sshd.NewServer(cfg)
9285
if err != nil {
93-
log.ErrorContext(ctx, "Failed to start Gitlab built-in sshd", slog.String(
86+
slog.ErrorContext(ctx, "Failed to start Gitlab built-in sshd", slog.String(
9487
fields.ErrorMessage, err.Error(),
9588
))
9689
}
9790

9891
// Startup monitoring endpoint.
9992
if cfg.Server.WebListen != "" {
100-
startupMonitoringEndpoint(ctx, cfg, server, log)
93+
startupMonitoringEndpoint(ctx, cfg, server)
10194
}
10295

10396
ctx, cancel := context.WithCancel(ctx)
@@ -106,10 +99,10 @@ func main() {
10699
done := make(chan os.Signal, 1)
107100
signal.Notify(done, syscall.SIGINT, syscall.SIGTERM)
108101

109-
gracefulShutdown(ctx, done, cfg, server, cancel, log)
102+
gracefulShutdown(ctx, done, cfg, server, cancel)
110103

111104
if err := server.ListenAndServe(ctx); err != nil {
112-
log.ErrorContext(ctx, "GitLab built-in sshd failed to listen for new connections",
105+
slog.ErrorContext(ctx, "GitLab built-in sshd failed to listen for new connections",
113106
slog.String(fields.ErrorMessage, err.Error()))
114107
}
115108
}
@@ -120,18 +113,17 @@ func gracefulShutdown(
120113
cfg *config.Config,
121114
server *sshd.Server,
122115
cancel context.CancelFunc,
123-
log *slog.Logger,
124116
) {
125117
go func() {
126118
sig := <-done
127119
signal.Reset(syscall.SIGINT, syscall.SIGTERM)
128120

129121
gracePeriod := time.Duration(cfg.Server.GracePeriod)
130-
log.InfoContext(ctx, fmt.Sprintf("Shutdown initiated with grace period: %f", gracePeriod.Seconds()),
122+
slog.InfoContext(ctx, fmt.Sprintf("Shutdown initiated with grace period: %f", gracePeriod.Seconds()),
131123
slog.String("signal", sig.String()))
132124

133125
if err := server.Shutdown(); err != nil {
134-
log.ErrorContext(ctx, "Error shutting down the server", slog.String(
126+
slog.ErrorContext(ctx, "Error shutting down the server", slog.String(
135127
fields.ErrorMessage, err.Error()))
136128
}
137129
<-time.After(gracePeriod)
@@ -140,15 +132,15 @@ func gracefulShutdown(
140132
}()
141133
}
142134

143-
func startupMonitoringEndpoint(ctx context.Context, cfg *config.Config, server *sshd.Server, log *slog.Logger) {
135+
func startupMonitoringEndpoint(ctx context.Context, cfg *config.Config, server *sshd.Server) {
144136
go func() {
145137
err := monitoring.Start(
146138
monitoring.WithListenerAddress(cfg.Server.WebListen),
147139
monitoring.WithBuildInformation(Version, BuildTime),
148140
monitoring.WithServeMux(server.MonitoringServeMux()),
149141
)
150142

151-
log.ErrorContext(ctx, "monitoring service raised an error", slog.String(
143+
slog.ErrorContext(ctx, "monitoring service raised an error", slog.String(
152144
fields.ErrorMessage, err.Error(),
153145
))
154146
panic(err)

internal/command/command.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,16 @@ package command
66
import (
77
"context"
88
"fmt"
9+
"log/slog"
910
"os"
1011
"path"
1112
"strings"
1213

1314
"gitlab.com/gitlab-org/gitlab-shell/v14/internal/config"
1415
"gitlab.com/gitlab-org/labkit/correlation"
16+
"gitlab.com/gitlab-org/labkit/fields"
1517
"gitlab.com/gitlab-org/labkit/tracing"
18+
"gitlab.com/gitlab-org/labkit/v2/log"
1619
)
1720

1821
// Command is the interface that all gitlab-shell commands must implement.
@@ -82,6 +85,7 @@ func Setup(serviceName string, config *config.Config) (context.Context, func())
8285
if correlationID == "" {
8386
correlationID := correlation.SafeRandomID()
8487
ctx = correlation.ContextWithCorrelation(ctx, correlationID)
88+
ctx = log.WithFields(ctx, slog.String(fields.CorrelationID, correlationID))
8589
}
8690

8791
return ctx, func() {

internal/logger/logger.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,20 @@ import (
1818
// ConfigureLogger - gitlab-sshd's log output can be configured to text as per the documentation:
1919
// https://docs.gitlab.com/omnibus/settings/logs/#json-logging
2020
// This is currently controlled by the GITLAB_LOG_FORMAT environment variable.
21-
func ConfigureLogger(cfg *config.Config) (*slog.Logger, io.Closer, error) {
21+
func ConfigureLogger(cfg *config.Config) io.Closer {
2222
logConfig := &v2log.Config{
2323
LogLevel: parseLogLevel(cfg.LogLevel),
2424
}
2525
if gitlabLogFormat := os.Getenv("GITLAB_LOG_FORMAT"); gitlabLogFormat == "text" {
2626
logConfig.UseTextFormat = true
2727
}
28-
return v2log.NewWithFile(cfg.LogFile, logConfig)
28+
logger, logCloser, err := v2log.NewWithFile(cfg.LogFile, logConfig)
29+
slog.SetDefault(logger)
30+
if err != nil {
31+
return nil
32+
}
33+
34+
return logCloser
2935
}
3036

3137
func parseLogLevel(level string) slog.Level {

internal/logger/logger_test.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package logger
22

33
import (
44
"io"
5+
"log/slog"
56
"os"
67
"regexp"
78
"testing"
@@ -108,11 +109,12 @@ func TestConfigureLabkitV2Log(t *testing.T) {
108109
LogLevel: "debug",
109110
}
110111

111-
logger, closer, err := ConfigureLogger(&config)
112-
require.NoError(t, err)
113-
defer MustClose(t, closer)
114-
logger.Info("this is a test")
115-
logger.Debug("debug log message")
112+
closer := ConfigureLogger(&config)
113+
if closer != nil {
114+
defer MustClose(t, closer)
115+
}
116+
slog.Info("this is a test")
117+
slog.Debug("debug log message")
116118

117119
data, err := os.ReadFile(tmpFile)
118120
dataStr := string(data)

0 commit comments

Comments
 (0)