From ce685aa49df0639af684568a2c59183c44ee5e7f Mon Sep 17 00:00:00 2001 From: Mauri de Souza Meneguzzo Date: Mon, 7 Oct 2024 11:16:40 -0300 Subject: [PATCH] fix: don't write to files by default if running in a container environment --- logp/config.go | 9 ++++++- logp/defaults_test.go | 55 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/logp/config.go b/logp/config.go index 87c8e8c..58f2db6 100644 --- a/logp/config.go +++ b/logp/config.go @@ -70,9 +70,16 @@ const ( // DefaultConfig returns the default config options for a given environment the // Beat is supposed to be run within. func DefaultConfig(environment Environment) Config { + toFiles := true + + // If running in a container environment, don't write to files by default. + if environment == ContainerEnvironment { + toFiles = false + } + return Config{ Level: defaultLevel, - ToFiles: true, + ToFiles: toFiles, Files: FileConfig{ MaxSize: 10 * 1024 * 1024, MaxBackups: 7, diff --git a/logp/defaults_test.go b/logp/defaults_test.go index aeec9bc..e9d6434 100644 --- a/logp/defaults_test.go +++ b/logp/defaults_test.go @@ -19,9 +19,11 @@ package logp_test import ( "bufio" + "bytes" "encoding/json" "fmt" "os" + "os/exec" "path/filepath" "runtime" "sort" @@ -117,6 +119,59 @@ func TestDefaultConfig(t *testing.T) { } } +func TestDefaultConfigContainer(t *testing.T) { + switch runtime.GOOS { + case "wasip1", "js", "ios": + t.Skipf("cannot exec subprocess on %s/%s", runtime.GOOS, runtime.GOARCH) + } + + if os.Getenv("TEST_DEFAULT_CONFIG_CONTAINER") != "1" { + cmd := exec.Command(os.Args[0], "-test.run=^TestDefaultConfigContainer$", "-test.v") + cmd.Env = append(cmd.Env, "TEST_DEFAULT_CONFIG_CONTAINER=1") + + var stderr bytes.Buffer + cmd.Stderr = &stderr + + err := cmd.Run() + data := stderr.Bytes() + if err != nil { + t.Fatalf("command failed with error: %s\nstderr: %s", err, data) + } + t.Logf("output:\n%s", data) + + logEntry := struct { + LogLevel string `json:"log.level"` + LogOrigin struct { + FileName string `json:"file.name"` + FileLine int `json:"file.line"` + } `json:"log.origin"` + Message string `json:"message"` + }{} + + assert.NoError(t, json.Unmarshal(data, &logEntry), "cannot unmarshal log entry from stderr") + + assert.Equal(t, "info", logEntry.LogLevel) + assert.Equal(t, "foo", logEntry.Message) + + _, fileName, _, _ := runtime.Caller(0) + expectedFileName := filepath.Base(fileName) + gotFileName := filepath.Base(logEntry.LogOrigin.FileName) + assert.Equal(t, expectedFileName, gotFileName) + + return + } + + // This is running in a separate process. By default the + // container environment should be logging to stderr. + cfg := logp.DefaultConfig(logp.ContainerEnvironment) + if err := logp.Configure(cfg); err != nil { + t.Errorf("logp.Configure failed: %s", err.Error()) + } + logger := logp.L() + defer logger.Close() + logger.Info("foo") +} + func TestWith(t *testing.T) { tempDir := t.TempDir()