2016-10-11 20:06:17 +08:00
|
|
|
package logger
|
|
|
|
|
|
|
|
|
|
import (
|
2024-06-25 21:48:56 +08:00
|
|
|
"io"
|
2016-10-11 20:06:17 +08:00
|
|
|
"log"
|
|
|
|
|
"os"
|
2019-05-04 01:25:28 +08:00
|
|
|
"path/filepath"
|
2016-10-11 20:06:17 +08:00
|
|
|
"testing"
|
2024-07-26 23:09:21 +08:00
|
|
|
"time"
|
2016-10-11 20:06:17 +08:00
|
|
|
|
2024-07-26 23:09:21 +08:00
|
|
|
"github.com/influxdata/telegraf"
|
2019-05-04 01:25:28 +08:00
|
|
|
"github.com/stretchr/testify/require"
|
2016-10-11 20:06:17 +08:00
|
|
|
)
|
|
|
|
|
|
2024-07-26 23:09:21 +08:00
|
|
|
func TestLogTargetDefault(t *testing.T) {
|
|
|
|
|
instance = defaultHandler()
|
|
|
|
|
cfg := &Config{
|
|
|
|
|
Quiet: true,
|
|
|
|
|
}
|
|
|
|
|
require.NoError(t, SetupLogging(cfg))
|
|
|
|
|
logger, ok := instance.impl.(*defaultLogger)
|
|
|
|
|
require.True(t, ok, "logging instance is not a default-logger")
|
|
|
|
|
require.Equal(t, logger.logger.Writer(), os.Stderr)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestLogTargetStderr(t *testing.T) {
|
|
|
|
|
instance = defaultHandler()
|
|
|
|
|
cfg := &Config{
|
|
|
|
|
LogTarget: "stderr",
|
|
|
|
|
Quiet: true,
|
|
|
|
|
}
|
|
|
|
|
require.NoError(t, SetupLogging(cfg))
|
|
|
|
|
logger, ok := instance.impl.(*defaultLogger)
|
|
|
|
|
require.True(t, ok, "logging instance is not a default-logger")
|
|
|
|
|
require.Equal(t, logger.logger.Writer(), os.Stderr)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestLogTargetFile(t *testing.T) {
|
2021-09-29 05:16:32 +08:00
|
|
|
tmpfile, err := os.CreateTemp("", "")
|
2022-10-13 04:23:53 +08:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
defer os.Remove(tmpfile.Name())
|
2016-10-11 20:06:17 +08:00
|
|
|
|
2024-07-26 23:09:21 +08:00
|
|
|
cfg := &Config{
|
|
|
|
|
Logfile: tmpfile.Name(),
|
|
|
|
|
LogTarget: "file",
|
|
|
|
|
RotationMaxArchives: -1,
|
|
|
|
|
}
|
|
|
|
|
require.NoError(t, SetupLogging(cfg))
|
|
|
|
|
|
2016-10-11 20:06:17 +08:00
|
|
|
log.Printf("I! TEST")
|
|
|
|
|
log.Printf("D! TEST") // <- should be ignored
|
|
|
|
|
|
2024-07-26 23:09:21 +08:00
|
|
|
buf, err := os.ReadFile(tmpfile.Name())
|
2022-10-13 04:23:53 +08:00
|
|
|
require.NoError(t, err)
|
2024-07-26 23:09:21 +08:00
|
|
|
require.Greater(t, len(buf), 19)
|
|
|
|
|
require.Equal(t, buf[19:], []byte("Z I! TEST\n"))
|
2016-10-11 20:06:17 +08:00
|
|
|
}
|
|
|
|
|
|
2024-07-26 23:09:21 +08:00
|
|
|
func TestLogTargetFileDebug(t *testing.T) {
|
2021-09-29 05:16:32 +08:00
|
|
|
tmpfile, err := os.CreateTemp("", "")
|
2022-10-13 04:23:53 +08:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
defer os.Remove(tmpfile.Name())
|
|
|
|
|
|
2024-07-26 23:09:21 +08:00
|
|
|
cfg := &Config{
|
|
|
|
|
Logfile: tmpfile.Name(),
|
|
|
|
|
LogTarget: "file",
|
|
|
|
|
RotationMaxArchives: -1,
|
|
|
|
|
Debug: true,
|
|
|
|
|
}
|
|
|
|
|
require.NoError(t, SetupLogging(cfg))
|
|
|
|
|
|
2016-10-11 20:06:17 +08:00
|
|
|
log.Printf("D! TEST")
|
|
|
|
|
|
2024-07-26 23:09:21 +08:00
|
|
|
buf, err := os.ReadFile(tmpfile.Name())
|
2022-10-13 04:23:53 +08:00
|
|
|
require.NoError(t, err)
|
2024-07-26 23:09:21 +08:00
|
|
|
require.Greater(t, len(buf), 19)
|
|
|
|
|
require.Equal(t, buf[19:], []byte("Z D! TEST\n"))
|
2016-10-11 20:06:17 +08:00
|
|
|
}
|
|
|
|
|
|
2024-07-26 23:09:21 +08:00
|
|
|
func TestLogTargetFileError(t *testing.T) {
|
2021-09-29 05:16:32 +08:00
|
|
|
tmpfile, err := os.CreateTemp("", "")
|
2022-10-13 04:23:53 +08:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
defer os.Remove(tmpfile.Name())
|
|
|
|
|
|
2024-07-26 23:09:21 +08:00
|
|
|
cfg := &Config{
|
|
|
|
|
Logfile: tmpfile.Name(),
|
|
|
|
|
LogTarget: "file",
|
|
|
|
|
RotationMaxArchives: -1,
|
|
|
|
|
Quiet: true,
|
|
|
|
|
}
|
|
|
|
|
require.NoError(t, SetupLogging(cfg))
|
|
|
|
|
|
2016-10-11 20:06:17 +08:00
|
|
|
log.Printf("E! TEST")
|
|
|
|
|
log.Printf("I! TEST") // <- should be ignored
|
|
|
|
|
|
2024-07-26 23:09:21 +08:00
|
|
|
buf, err := os.ReadFile(tmpfile.Name())
|
2022-10-13 04:23:53 +08:00
|
|
|
require.NoError(t, err)
|
2024-07-26 23:09:21 +08:00
|
|
|
require.Greater(t, len(buf), 19)
|
|
|
|
|
require.Equal(t, buf[19:], []byte("Z E! TEST\n"))
|
2016-10-11 20:06:17 +08:00
|
|
|
}
|
|
|
|
|
|
2017-04-13 01:41:26 +08:00
|
|
|
func TestAddDefaultLogLevel(t *testing.T) {
|
2021-09-29 05:16:32 +08:00
|
|
|
tmpfile, err := os.CreateTemp("", "")
|
2022-10-13 04:23:53 +08:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
defer os.Remove(tmpfile.Name())
|
|
|
|
|
|
2024-07-26 23:09:21 +08:00
|
|
|
cfg := &Config{
|
|
|
|
|
Logfile: tmpfile.Name(),
|
|
|
|
|
LogTarget: "file",
|
|
|
|
|
RotationMaxArchives: -1,
|
|
|
|
|
Debug: true,
|
|
|
|
|
}
|
|
|
|
|
require.NoError(t, SetupLogging(cfg))
|
|
|
|
|
|
2017-04-13 01:41:26 +08:00
|
|
|
log.Printf("TEST")
|
|
|
|
|
|
2024-07-26 23:09:21 +08:00
|
|
|
buf, err := os.ReadFile(tmpfile.Name())
|
2022-10-13 04:23:53 +08:00
|
|
|
require.NoError(t, err)
|
2024-07-26 23:09:21 +08:00
|
|
|
require.Greater(t, len(buf), 19)
|
|
|
|
|
require.Equal(t, buf[19:], []byte("Z I! TEST\n"))
|
2017-04-13 01:41:26 +08:00
|
|
|
}
|
|
|
|
|
|
2019-02-28 08:33:38 +08:00
|
|
|
func TestWriteToTruncatedFile(t *testing.T) {
|
2021-09-29 05:16:32 +08:00
|
|
|
tmpfile, err := os.CreateTemp("", "")
|
2022-10-13 04:23:53 +08:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
defer os.Remove(tmpfile.Name())
|
|
|
|
|
|
2024-07-26 23:09:21 +08:00
|
|
|
cfg := &Config{
|
|
|
|
|
Logfile: tmpfile.Name(),
|
|
|
|
|
LogTarget: "file",
|
|
|
|
|
RotationMaxArchives: -1,
|
|
|
|
|
Debug: true,
|
|
|
|
|
}
|
|
|
|
|
require.NoError(t, SetupLogging(cfg))
|
|
|
|
|
|
2019-02-28 08:33:38 +08:00
|
|
|
log.Printf("TEST")
|
|
|
|
|
|
2024-07-26 23:09:21 +08:00
|
|
|
buf, err := os.ReadFile(tmpfile.Name())
|
2022-10-13 04:23:53 +08:00
|
|
|
require.NoError(t, err)
|
2024-07-26 23:09:21 +08:00
|
|
|
require.Greater(t, len(buf), 19)
|
|
|
|
|
require.Equal(t, buf[19:], []byte("Z I! TEST\n"))
|
2019-02-28 08:33:38 +08:00
|
|
|
|
2023-04-04 22:51:08 +08:00
|
|
|
tmpf, err := os.OpenFile(tmpfile.Name(), os.O_RDWR|os.O_TRUNC, 0640)
|
2022-10-13 04:23:53 +08:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
require.NoError(t, tmpf.Close())
|
2019-02-28 08:33:38 +08:00
|
|
|
|
|
|
|
|
log.Printf("SHOULD BE FIRST")
|
|
|
|
|
|
2024-07-26 23:09:21 +08:00
|
|
|
buf, err = os.ReadFile(tmpfile.Name())
|
2022-10-13 04:23:53 +08:00
|
|
|
require.NoError(t, err)
|
2024-07-26 23:09:21 +08:00
|
|
|
require.Equal(t, buf[19:], []byte("Z I! SHOULD BE FIRST\n"))
|
2019-02-28 08:33:38 +08:00
|
|
|
}
|
|
|
|
|
|
2019-05-04 01:25:28 +08:00
|
|
|
func TestWriteToFileInRotation(t *testing.T) {
|
2022-04-19 03:27:59 +08:00
|
|
|
tempDir := t.TempDir()
|
2024-07-26 23:09:21 +08:00
|
|
|
cfg := &Config{
|
|
|
|
|
Logfile: filepath.Join(tempDir, "test.log"),
|
|
|
|
|
LogTarget: "file",
|
|
|
|
|
RotationMaxArchives: -1,
|
|
|
|
|
RotationMaxSize: 30,
|
|
|
|
|
}
|
2024-05-11 05:43:43 +08:00
|
|
|
require.NoError(t, SetupLogging(cfg))
|
2024-07-26 23:09:21 +08:00
|
|
|
|
2019-05-04 01:25:28 +08:00
|
|
|
// Close the writer here, otherwise the temp folder cannot be deleted because the current log file is in use.
|
2024-07-26 23:09:21 +08:00
|
|
|
defer CloseLogging() //nolint:errcheck // We cannot do anything if this fails
|
2019-05-04 01:25:28 +08:00
|
|
|
|
|
|
|
|
log.Printf("I! TEST 1") // Writes 31 bytes, will rotate
|
|
|
|
|
log.Printf("I! TEST") // Writes 29 byes, no rotation expected
|
2024-07-26 23:09:21 +08:00
|
|
|
|
2024-06-04 16:33:37 +08:00
|
|
|
files, err := os.ReadDir(tempDir)
|
|
|
|
|
require.NoError(t, err)
|
2023-10-31 17:29:53 +08:00
|
|
|
require.Len(t, files, 2)
|
2019-05-04 01:25:28 +08:00
|
|
|
}
|
|
|
|
|
|
2016-10-11 20:06:17 +08:00
|
|
|
func BenchmarkTelegrafLogWrite(b *testing.B) {
|
2024-06-25 21:48:56 +08:00
|
|
|
l, err := createDefaultLogger(&Config{})
|
|
|
|
|
require.NoError(b, err)
|
|
|
|
|
|
|
|
|
|
// Discard all logging output
|
|
|
|
|
dl := l.(*defaultLogger)
|
2024-07-26 23:09:21 +08:00
|
|
|
dl.SetOutput(io.Discard)
|
2024-06-25 21:48:56 +08:00
|
|
|
|
2024-07-26 23:09:21 +08:00
|
|
|
ts := time.Now()
|
2016-10-11 20:06:17 +08:00
|
|
|
for i := 0; i < b.N; i++ {
|
2024-07-26 23:09:21 +08:00
|
|
|
dl.Print(telegraf.Debug, ts, "", "test")
|
2019-05-04 01:25:28 +08:00
|
|
|
}
|
|
|
|
|
}
|