Skip to content

Commit b3afcc9

Browse files
Igor Drozdove_forbes
authored andcommitted
Merge branch 'ef-ensure-we-log-to-log-file' into 'main'
fix: ensure logs are routed to correct file with correct min level See merge request https://gitlab.com/gitlab-org/gitlab-shell/-/merge_requests/1369 Merged-by: Igor Drozdov <idrozdov@gitlab.com> Approved-by: Igor Drozdov <idrozdov@gitlab.com> Co-authored-by: e_forbes <eforbes@gitlab.com>
2 parents 4aa37d0 + 6f95767 commit b3afcc9

5 files changed

Lines changed: 66 additions & 20 deletions

File tree

cmd/gitlab-sshd/main.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,20 +46,19 @@ func overrideConfigFromEnvironment(cfg *config.Config) {
4646
func main() {
4747
ctx := context.Background()
4848
command.CheckForVersionFlag(os.Args, Version, BuildTime)
49-
50-
log := logger.ConfigureLogger()
5149
flag.Parse()
5250

5351
cfg := new(config.Config)
5452
if *configDir != "" {
5553
var err error
5654
cfg, err = config.NewFromDir(*configDir)
5755
if err != nil {
58-
log.ErrorContext(ctx, "failed to load configuration from specified directory", slog.String(
56+
v2log.New().ErrorContext(ctx, "failed to load configuration from specified directory", slog.String(
5957
fields.ErrorMessage, err.Error(),
6058
))
6159
}
6260
}
61+
log := logger.ConfigureLogger(cfg)
6362
log.InfoContext(ctx, "gitlab-sshd starting up...")
6463

6564
overrideConfigFromEnvironment(cfg)

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ require (
2323
// Please do not override. Once v16.11.1 is released, this comment
2424
// can be removed.
2525
gitlab.com/gitlab-org/gitaly/v16 v16.11.0-rc1.0.20250408053233-c6d43513e93c
26-
gitlab.com/gitlab-org/labkit v1.35.0
26+
gitlab.com/gitlab-org/labkit v1.36.0
2727
golang.org/x/crypto v0.41.0
2828
golang.org/x/sync v0.16.0
2929
google.golang.org/grpc v1.72.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -554,8 +554,8 @@ gitlab.com/gitlab-org/gitaly/v16 v16.11.0-rc1.0.20250408053233-c6d43513e93c h1:x
554554
gitlab.com/gitlab-org/gitaly/v16 v16.11.0-rc1.0.20250408053233-c6d43513e93c/go.mod h1:/rkj6992VsNymUeG6N3VnLZ8Pvb1Y9ZUo00Yy35t8WQ=
555555
gitlab.com/gitlab-org/go/reopen v1.0.0 h1:6BujZ0lkkjGIejTUJdNO1w56mN1SI10qcVQyQlOPM+8=
556556
gitlab.com/gitlab-org/go/reopen v1.0.0/go.mod h1:D6OID8YJDzEVZNYW02R/Pkj0v8gYFSIhXFTArAsBQw8=
557-
gitlab.com/gitlab-org/labkit v1.35.0 h1:6PSRUvmuEKFrAZpQPLlMNIdbtZHyKHaqyRlM4PDYDbs=
558-
gitlab.com/gitlab-org/labkit v1.35.0/go.mod h1:JqQLdgjV/KKAZJ6gvNodaLStmWeTT9mxgJPIEi66VHI=
557+
gitlab.com/gitlab-org/labkit v1.36.0 h1:QA60DLXmtOyIRchrxaRwonrtbviWQogA623tR2JijE4=
558+
gitlab.com/gitlab-org/labkit v1.36.0/go.mod h1:JqQLdgjV/KKAZJ6gvNodaLStmWeTT9mxgJPIEi66VHI=
559559
go.etcd.io/raft/v3 v3.6.0 h1:5NtvbDVYpnfZWcIHgGRk9DyzkBIXOi8j+DDp1IcnUWQ=
560560
go.etcd.io/raft/v3 v3.6.0/go.mod h1:nLvLevg6+xrVtHUmVaTcTz603gQPHfh7kUAwV6YpfGo=
561561
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=

internal/logger/logger.go

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,49 @@ 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() *slog.Logger {
21+
func ConfigureLogger(cfg *config.Config) *slog.Logger {
22+
logConfig := &v2log.Config{
23+
LogLevel: parseLogLevel(cfg.LogLevel),
24+
}
25+
logFile, err := os.OpenFile(cfg.LogFile, os.O_APPEND|os.O_WRONLY, 0600)
26+
if err != nil {
27+
syslogError(err)
28+
logConfig.Writer = os.Stderr
29+
} else {
30+
logConfig.Writer = logFile
31+
}
32+
2233
if gitlabLogFormat := os.Getenv("GITLAB_LOG_FORMAT"); gitlabLogFormat == "text" {
23-
return v2log.NewWithConfig(&v2log.Config{
24-
UseTextFormat: true,
25-
})
34+
logConfig.UseTextFormat = true
35+
}
36+
return v2log.NewWithConfig(logConfig)
37+
}
38+
39+
func parseLogLevel(level string) slog.Level {
40+
switch level {
41+
case "DEBUG", "debug":
42+
return slog.LevelDebug
43+
case "INFO", "info":
44+
return slog.LevelInfo
45+
case "WARN", "warn":
46+
return slog.LevelWarn
47+
case "ERROR", "error":
48+
return slog.LevelError
49+
default:
50+
return slog.LevelInfo
51+
}
52+
}
53+
54+
func syslogError(err error) {
55+
syslogLogger, syslogLoggerErr := syslog.NewLogger(syslog.LOG_ERR|syslog.LOG_USER, 0)
56+
progName, _ := os.Executable()
57+
if syslogLoggerErr == nil {
58+
msg := fmt.Sprintf("%s: Unable to configure logging: %v\n", progName, err.Error())
59+
syslogLogger.Print(msg)
60+
} else {
61+
msg := fmt.Sprintf("%s: Unable to configure logging: %v, %v\n", progName, err.Error(), syslogLoggerErr.Error())
62+
fmt.Fprintln(os.Stderr, msg)
2663
}
27-
return v2log.New()
2864
}
2965

3066
func logFmt(inFmt string) string {
@@ -74,15 +110,7 @@ func Configure(cfg *config.Config) io.Closer {
74110
}
75111

76112
if err != nil {
77-
progName, _ := os.Executable()
78-
syslogLogger, syslogLoggerErr := syslog.NewLogger(syslog.LOG_ERR|syslog.LOG_USER, 0)
79-
if syslogLoggerErr == nil {
80-
msg := fmt.Sprintf("%s: Unable to configure logging: %v\n", progName, err.Error())
81-
syslogLogger.Print(msg)
82-
} else {
83-
msg := fmt.Sprintf("%s: Unable to configure logging: %v, %v\n", progName, err.Error(), syslogLoggerErr.Error())
84-
fmt.Fprintln(os.Stderr, msg)
85-
}
113+
syslogError(err)
86114

87115
cfg.LogFile = "/dev/null"
88116
closer, err = log.Initialize(buildOpts(cfg)...)

internal/logger/logger_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,3 +98,22 @@ func createTempFile(t *testing.T) string {
9898

9999
return tmpFile.Name()
100100
}
101+
102+
func TestConfigureLabkitV2Log(t *testing.T) {
103+
tmpFile := createTempFile(t)
104+
config := config.Config{
105+
LogFile: tmpFile,
106+
LogFormat: "json",
107+
LogLevel: "debug",
108+
}
109+
110+
logger := ConfigureLogger(&config)
111+
logger.Info("this is a test")
112+
logger.Debug("debug log message")
113+
114+
data, err := os.ReadFile(tmpFile)
115+
dataStr := string(data)
116+
require.NoError(t, err)
117+
require.Contains(t, dataStr, `"msg":"this is a test"`)
118+
require.Contains(t, dataStr, `"msg":"debug log message"`)
119+
}

0 commit comments

Comments
 (0)