Skip to content

Commit

Permalink
logp: don't write to files by default if running in a container envir…
Browse files Browse the repository at this point in the history
…onment (elastic#236)

* fix: don't write to files by default if running in a container environment

* fix gosec lint

* systemd should also log to stderr

* reuse code between tests
  • Loading branch information
mauri870 authored Oct 9, 2024
1 parent 6904fdc commit 6634efe
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 2 deletions.
15 changes: 13 additions & 2 deletions logp/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,9 +70,20 @@ 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
toStderr := false

// For container and systemd environments, we don't write to files by default.
switch environment {
case ContainerEnvironment, SystemdEnvironment:
toFiles = false
toStderr = true
}

return Config{
Level: defaultLevel,
ToFiles: true,
Level: defaultLevel,
ToFiles: toFiles,
ToStderr: toStderr,
Files: FileConfig{
MaxSize: 10 * 1024 * 1024,
MaxBackups: 7,
Expand Down
58 changes: 58 additions & 0 deletions logp/defaults_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,11 @@ package logp_test

import (
"bufio"
"bytes"
"encoding/json"
"fmt"
"os"
"os/exec"
"path/filepath"
"runtime"
"sort"
Expand Down Expand Up @@ -117,6 +119,62 @@ func TestDefaultConfig(t *testing.T) {
}
}

func TestDefaultConfigContainerLogsToStderr(t *testing.T) {
runTestEnvStderr(t, logp.ContainerEnvironment)
}

func TestDefaultConfigSystemdLogsToStderr(t *testing.T) {
runTestEnvStderr(t, logp.SystemdEnvironment)
}

func runTestEnvStderr(t *testing.T, envType logp.Environment) {
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_STDERR") != "1" {
cmd := exec.Command(os.Args[0], fmt.Sprintf("-test.run=^%s$", t.Name()), "-test.v") //nolint:gosec // This is intentionally running a subprocess
cmd.Env = append(cmd.Env, "TEST_DEFAULT_CONFIG_STDERR=1")

var stderr bytes.Buffer
cmd.Stderr = &stderr

err := cmd.Run()
data := stderr.Bytes()
assert.NoError(t, err, "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 to make sure we capture stderr.
cfg := logp.DefaultConfig(envType)
assert.NoError(t, logp.Configure(cfg))
logger := logp.L()
defer logger.Close()
logger.Info("foo")
}

func TestWith(t *testing.T) {
tempDir := t.TempDir()

Expand Down

0 comments on commit 6634efe

Please sign in to comment.