Skip to content

Commit 6bb674b

Browse files
authored
fix: Make runner log writers respect 'N8N_RUNNERS_LAUNCHER_LOG_LEVEL' default (#80)
1 parent 4b17528 commit 6bb674b

File tree

4 files changed

+77
-58
lines changed

4 files changed

+77
-58
lines changed

internal/commands/launch.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,8 @@ func (c *LaunchCommand) Execute(launcherConfig *config.LauncherConfig, runnerTyp
104104
cmd := exec.CommandContext(ctx, runnerConfig.Command, runnerConfig.Args...)
105105
cmd.Env = runnerEnv
106106
runnerPrefix := logs.GetRunnerPrefix(runnerType)
107-
cmd.Stdout, cmd.Stderr = logs.GetRunnerWriters(runnerPrefix)
107+
logLevel := logs.ParseLevel(launcherConfig.BaseConfig.LogLevel)
108+
cmd.Stdout, cmd.Stderr = logs.GetRunnerWriters(logLevel, runnerPrefix)
108109

109110
if err := cmd.Start(); err != nil {
110111
cancelHealthMonitor()

internal/logs/logger.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,17 @@ var levelMap = map[string]Level{
2323
"error": ErrorLevel,
2424
}
2525

26+
var levelNames = map[Level]string{
27+
DebugLevel: "DEBUG",
28+
InfoLevel: "INFO",
29+
WarnLevel: "WARN",
30+
ErrorLevel: "ERROR",
31+
}
32+
33+
func (l Level) String() string {
34+
return levelNames[l]
35+
}
36+
2637
var (
2738
ColorReset = "\033[0m"
2839
ColorRed = "\033[31m"

internal/logs/runner_writers.go

Lines changed: 16 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -10,42 +10,28 @@ import (
1010

1111
// RunnerWriter wraps runner output with timestamps and prefixes.
1212
type RunnerWriter struct {
13-
writer *log.Logger
14-
prefix string
15-
level string
16-
color string
13+
writer *log.Logger
14+
prefix string
15+
color string
16+
level Level
17+
minLevel Level
1718
}
1819

1920
// NewRunnerWriter creates a new wrapper for runner output.
20-
func NewRunnerWriter(w io.Writer, prefix string, level string, color string) *RunnerWriter {
21+
func NewRunnerWriter(w io.Writer, prefix string, color string, level Level, minLevel Level) *RunnerWriter {
2122
return &RunnerWriter{
22-
writer: log.New(w, "", log.LstdFlags),
23-
prefix: prefix,
24-
level: level,
25-
color: color,
26-
}
27-
}
28-
29-
var (
30-
shouldLogDebug bool
31-
logLevelChecked bool
32-
)
33-
34-
func initLogLevel() {
35-
if !logLevelChecked {
36-
logLevel := strings.ToUpper(os.Getenv("N8N_RUNNERS_LAUNCHER_LOG_LEVEL"))
37-
shouldLogDebug = logLevel == "DEBUG" || logLevel == ""
38-
logLevelChecked = true
23+
writer: log.New(w, "", log.LstdFlags),
24+
prefix: prefix,
25+
level: level,
26+
color: color,
27+
minLevel: minLevel,
3928
}
4029
}
4130

4231
// Write implements `io.Writer` and adds color, timestamp, level and a prefix to each line.
4332
func (w *RunnerWriter) Write(p []byte) (n int, err error) {
44-
if w.level == "DEBUG" {
45-
initLogLevel()
46-
if !shouldLogDebug {
47-
return len(p), nil
48-
}
33+
if w.level < w.minLevel {
34+
return len(p), nil
4935
}
5036

5137
scanner := bufio.NewScanner(strings.NewReader(string(p)))
@@ -66,9 +52,9 @@ func (w *RunnerWriter) Write(p []byte) (n int, err error) {
6652
}
6753

6854
// GetRunnerWriters returns configured `stdout` and `stderr` writers with a custom prefix.
69-
func GetRunnerWriters(prefix string) (stdout io.Writer, stderr io.Writer) {
70-
stdout = NewRunnerWriter(os.Stdout, prefix, "DEBUG", ColorCyan)
71-
stderr = NewRunnerWriter(os.Stderr, prefix, "ERROR", ColorRed)
55+
func GetRunnerWriters(minLevel Level, prefix string) (stdout io.Writer, stderr io.Writer) {
56+
stdout = NewRunnerWriter(os.Stdout, prefix, ColorCyan, DebugLevel, minLevel)
57+
stderr = NewRunnerWriter(os.Stderr, prefix, ColorRed, ErrorLevel, minLevel)
7258

7359
return stdout, stderr
7460
}

internal/logs/runner_writers_test.go

Lines changed: 48 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,19 @@ func TestRunnerWriter(t *testing.T) {
1414
name string
1515
input string
1616
prefix string
17-
level string
1817
color string
18+
level Level
19+
minLevel Level
1920
expectedParts []string
2021
skipParts []string
2122
}{
2223
{
23-
name: "writes single line with correct format",
24-
input: "test message",
25-
prefix: "[Test] ",
26-
level: "INFO",
27-
color: ColorBlue,
24+
name: "writes single line with correct format",
25+
input: "test message",
26+
prefix: "[Test] ",
27+
color: ColorBlue,
28+
level: InfoLevel,
29+
minLevel: DebugLevel,
2830
expectedParts: []string{
2931
ColorBlue,
3032
"INFO",
@@ -34,23 +36,41 @@ func TestRunnerWriter(t *testing.T) {
3436
},
3537
},
3638
{
37-
name: "handles multiple lines",
38-
input: "line1\nline2\nline3",
39-
prefix: "[Runner] ",
40-
level: "DEBUG",
41-
color: ColorCyan,
39+
name: "skips messages below min log level",
40+
input: "test message",
41+
prefix: "[Test] ",
42+
color: ColorBlue,
43+
level: DebugLevel,
44+
minLevel: InfoLevel,
45+
expectedParts: []string{},
46+
skipParts: []string{
47+
ColorBlue,
48+
"DEBUG",
49+
"[Test] ",
50+
"test message",
51+
ColorReset,
52+
},
53+
},
54+
{
55+
name: "handles multiple lines",
56+
input: "line1\nline2\nline3",
57+
prefix: "[Runner] ",
58+
color: ColorCyan,
59+
level: DebugLevel,
60+
minLevel: DebugLevel,
4261
expectedParts: []string{
4362
"[Runner] line1",
4463
"[Runner] line2",
4564
"[Runner] line3",
4665
},
4766
},
4867
{
49-
name: "skips empty lines",
50-
input: "line1\n\n\nline2",
51-
prefix: "[Test] ",
52-
level: "INFO",
53-
color: ColorBlue,
68+
name: "skips empty lines",
69+
input: "line1\n\n\nline2",
70+
prefix: "[Test] ",
71+
color: ColorBlue,
72+
level: InfoLevel,
73+
minLevel: DebugLevel,
5474
expectedParts: []string{
5575
"[Test] line1",
5676
"[Test] line2",
@@ -60,11 +80,12 @@ func TestRunnerWriter(t *testing.T) {
6080
},
6181
},
6282
{
63-
name: "respects whitespace in message",
64-
input: " indented message ",
65-
prefix: "[Test] ",
66-
level: "DEBUG",
67-
color: ColorCyan,
83+
name: "respects whitespace in message",
84+
input: " indented message ",
85+
prefix: "[Test] ",
86+
color: ColorCyan,
87+
level: DebugLevel,
88+
minLevel: DebugLevel,
6889
expectedParts: []string{
6990
"[Test] indented message ",
7091
},
@@ -74,7 +95,7 @@ func TestRunnerWriter(t *testing.T) {
7495
for _, tt := range tests {
7596
t.Run(tt.name, func(t *testing.T) {
7697
var buf bytes.Buffer
77-
writer := NewRunnerWriter(&buf, tt.prefix, tt.level, tt.color)
98+
writer := NewRunnerWriter(&buf, tt.prefix, tt.color, tt.level, tt.minLevel)
7899

79100
n, err := writer.Write([]byte(tt.input))
80101
assert.NoError(t, err, "RunnerWriter.Write() should not return an error")
@@ -95,7 +116,7 @@ func TestRunnerWriter(t *testing.T) {
95116

96117
func TestGetRunnerWriters(t *testing.T) {
97118
prefix := "[runner:js] "
98-
stdout, stderr := GetRunnerWriters(prefix)
119+
stdout, stderr := GetRunnerWriters(DebugLevel, prefix)
99120

100121
assert.NotNil(t, stdout, "GetRunnerWriters() stdout should not be nil")
101122
assert.NotNil(t, stderr, "GetRunnerWriters() stderr should not be nil")
@@ -107,12 +128,12 @@ func TestGetRunnerWriters(t *testing.T) {
107128
}
108129

109130
func TestGetRunnerWritersWithDifferentTypes(t *testing.T) {
110-
GetRunnerWriters("[runner:js] ")
111-
GetRunnerWriters("[runner:py] ")
131+
GetRunnerWriters(DebugLevel, "[runner:js] ")
132+
GetRunnerWriters(DebugLevel, "[runner:py] ")
112133

113134
var jsBuf, pyBuf bytes.Buffer
114-
jsWriter := NewRunnerWriter(&jsBuf, "[runner:js] ", "DEBUG", ColorCyan)
115-
pyWriter := NewRunnerWriter(&pyBuf, "[runner:py] ", "DEBUG", ColorCyan)
135+
jsWriter := NewRunnerWriter(&jsBuf, "[runner:js] ", ColorCyan, DebugLevel, DebugLevel)
136+
pyWriter := NewRunnerWriter(&pyBuf, "[runner:py] ", ColorCyan, DebugLevel, DebugLevel)
116137

117138
_, err := jsWriter.Write([]byte("test message"))
118139
require.NoError(t, err)

0 commit comments

Comments
 (0)