593 lines · 11.4 KB · Go
RawDownload
// Copyright 2019 The Gitea Authors. All rights reserved.// SPDX-License-Identifier: MIT package setting import (	"path/filepath"	"strings"	"testing" 	"forgejo.org/modules/json"	"forgejo.org/modules/log"	"forgejo.org/modules/test" 	"github.com/stretchr/testify/require") func initLoggersByConfig(t *testing.T, config string) (*log.LoggerManager, func()) {	defer test.MockVariableValue(&Log, LogGlobalConfig{})() 	cfg, err := NewConfigProviderFromData(config)	require.NoError(t, err) 	manager := log.NewManager()	initManagedLoggers(manager, cfg)	return manager, manager.Close} func initLoggerConfig(t *testing.T, config string) ConfigProvider {	defer test.MockVariableValue(&Log, LogGlobalConfig{})() 	cfg, err := NewConfigProviderFromData(config)	require.NoError(t, err) 	prepareLoggerConfig(cfg) 	return cfg} func toJSON(v any) string {	b, _ := json.MarshalIndent(v, "", "\t")	return string(b)} func TestLogConfigDefault(t *testing.T) {	manager, managerClose := initLoggersByConfig(t, ``)	defer managerClose() 	writerDump := `{	"console": {		"BufferLen": 10000,		"Colorize": false,		"Expression": "",		"Exclusion": "",		"Flags": "stdflags",		"Level": "info",		"Prefix": "",		"StacktraceLevel": "none",		"WriterOption": {			"Stderr": false		},		"WriterType": "console"	}}` 	dump := manager.GetLogger(log.DEFAULT).DumpWriters()	require.JSONEq(t, writerDump, toJSON(dump)) 	dump = manager.GetLogger("access").DumpWriters()	require.JSONEq(t, "{}", toJSON(dump)) 	dump = manager.GetLogger("router").DumpWriters()	require.JSONEq(t, writerDump, toJSON(dump)) 	dump = manager.GetLogger("xorm").DumpWriters()	require.JSONEq(t, writerDump, toJSON(dump))} func TestLogConfigDisable(t *testing.T) {	manager, managerClose := initLoggersByConfig(t, `[log]logger.router.MODE =logger.xorm.MODE =`)	defer managerClose() 	writerDump := `{	"console": {		"BufferLen": 10000,		"Colorize": false,		"Expression": "",		"Exclusion": "",		"Flags": "stdflags",		"Level": "info",		"Prefix": "",		"StacktraceLevel": "none",		"WriterOption": {			"Stderr": false		},		"WriterType": "console"	}}` 	dump := manager.GetLogger(log.DEFAULT).DumpWriters()	require.JSONEq(t, writerDump, toJSON(dump)) 	dump = manager.GetLogger("access").DumpWriters()	require.JSONEq(t, "{}", toJSON(dump)) 	dump = manager.GetLogger("router").DumpWriters()	require.JSONEq(t, "{}", toJSON(dump)) 	dump = manager.GetLogger("xorm").DumpWriters()	require.JSONEq(t, "{}", toJSON(dump))} func TestLogConfigLegacyDefault(t *testing.T) {	manager, managerClose := initLoggersByConfig(t, `[log]MODE = console`)	defer managerClose() 	writerDump := `{	"console": {		"BufferLen": 10000,		"Colorize": false,		"Expression": "",		"Exclusion": "",		"Flags": "stdflags",		"Level": "info",		"Prefix": "",		"StacktraceLevel": "none",		"WriterOption": {			"Stderr": false		},		"WriterType": "console"	}}` 	dump := manager.GetLogger(log.DEFAULT).DumpWriters()	require.JSONEq(t, writerDump, toJSON(dump)) 	dump = manager.GetLogger("access").DumpWriters()	require.JSONEq(t, "{}", toJSON(dump)) 	dump = manager.GetLogger("router").DumpWriters()	require.JSONEq(t, writerDump, toJSON(dump)) 	dump = manager.GetLogger("xorm").DumpWriters()	require.JSONEq(t, writerDump, toJSON(dump))} func TestLogConfigLegacyMode(t *testing.T) {	tempDir := t.TempDir() 	tempPath := func(file string) string {		return filepath.Join(tempDir, file)	} 	manager, managerClose := initLoggersByConfig(t, `[log]ROOT_PATH = `+tempDir+`MODE = fileROUTER = fileACCESS = file`)	defer managerClose() 	writerDump := `{	"file": {		"BufferLen": 10000,		"Colorize": false,		"Expression": "",		"Exclusion": "",		"Flags": "stdflags",		"Level": "info",		"Prefix": "",		"StacktraceLevel": "none",		"WriterOption": {			"Compress": true,			"CompressionLevel": -1,			"DailyRotate": true,			"FileName": "$FILENAME",			"LogRotate": true,			"MaxDays": 7,			"MaxSize": 268435456		},		"WriterType": "file"	}}`	writerDumpAccess := `{	"file.access": {		"BufferLen": 10000,		"Colorize": false,		"Expression": "",		"Exclusion": "",		"Flags": "none",		"Level": "info",		"Prefix": "",		"StacktraceLevel": "none",		"WriterOption": {			"Compress": true,			"CompressionLevel": -1,			"DailyRotate": true,			"FileName": "$FILENAME",			"LogRotate": true,			"MaxDays": 7,			"MaxSize": 268435456		},		"WriterType": "file"	}}`	dump := manager.GetLogger(log.DEFAULT).DumpWriters()	require.JSONEq(t, strings.ReplaceAll(writerDump, "$FILENAME", tempPath("gitea.log")), toJSON(dump)) 	dump = manager.GetLogger("access").DumpWriters()	require.JSONEq(t, strings.ReplaceAll(writerDumpAccess, "$FILENAME", tempPath("access.log")), toJSON(dump)) 	dump = manager.GetLogger("router").DumpWriters()	require.JSONEq(t, strings.ReplaceAll(writerDump, "$FILENAME", tempPath("gitea.log")), toJSON(dump))} func TestLogConfigLegacyModeDisable(t *testing.T) {	manager, managerClose := initLoggersByConfig(t, `[log]ROUTER = fileACCESS = fileDISABLE_ROUTER_LOG = trueENABLE_ACCESS_LOG = false`)	defer managerClose() 	dump := manager.GetLogger("access").DumpWriters()	require.JSONEq(t, "{}", toJSON(dump)) 	dump = manager.GetLogger("router").DumpWriters()	require.JSONEq(t, "{}", toJSON(dump))} func TestLogConfigNewConfig(t *testing.T) {	manager, managerClose := initLoggersByConfig(t, `[log]LOGGER_ACCESS_MODE = consoleLOGGER_XORM_MODE = console, console-1 [log.console]LEVEL = warn [log.console-1]MODE = consoleLEVEL = errorSTDERR = true`)	defer managerClose() 	writerDump := `{	"console": {		"BufferLen": 10000,		"Colorize": false,		"Expression": "",		"Exclusion": "",		"Flags": "stdflags",		"Level": "warn",		"Prefix": "",		"StacktraceLevel": "none",		"WriterOption": {			"Stderr": false		},		"WriterType": "console"	},	"console-1": {		"BufferLen": 10000,		"Colorize": false,		"Expression": "",		"Exclusion": "",		"Flags": "stdflags",		"Level": "error",		"Prefix": "",		"StacktraceLevel": "none",		"WriterOption": {			"Stderr": true		},		"WriterType": "console"	}}`	writerDumpAccess := `{	"console.access": {		"BufferLen": 10000,		"Colorize": false,		"Expression": "",		"Exclusion": "",		"Flags": "none",		"Level": "warn",		"Prefix": "",		"StacktraceLevel": "none",		"WriterOption": {			"Stderr": false		},		"WriterType": "console"	}}`	dump := manager.GetLogger("xorm").DumpWriters()	require.JSONEq(t, writerDump, toJSON(dump)) 	dump = manager.GetLogger("access").DumpWriters()	require.JSONEq(t, writerDumpAccess, toJSON(dump))} func TestLogConfigModeFile(t *testing.T) {	tempDir := t.TempDir() 	tempPath := func(file string) string {		return filepath.Join(tempDir, file)	} 	manager, managerClose := initLoggersByConfig(t, `[log]ROOT_PATH = `+tempDir+`BUFFER_LEN = 10MODE = file, file1 [log.file1]MODE = fileLEVEL = errorSTACKTRACE_LEVEL = fatalEXPRESSION = filterEXCLUSION = notFLAGS = medfilePREFIX = "[Prefix] "FILE_NAME = file-xxx.logLOG_ROTATE = falseMAX_SIZE_SHIFT = 1DAILY_ROTATE = falseMAX_DAYS = 90COMPRESS = falseCOMPRESSION_LEVEL = 4`)	defer managerClose() 	writerDump := `{	"file": {		"BufferLen": 10,		"Colorize": false,		"Expression": "",		"Exclusion": "",		"Flags": "stdflags",		"Level": "info",		"Prefix": "",		"StacktraceLevel": "none",		"WriterOption": {			"Compress": true,			"CompressionLevel": -1,			"DailyRotate": true,			"FileName": "$FILENAME-0",			"LogRotate": true,			"MaxDays": 7,			"MaxSize": 268435456		},		"WriterType": "file"	},	"file1": {		"BufferLen": 10,		"Colorize": false,		"Expression": "filter",		"Exclusion": "not",		"Flags": "medfile",		"Level": "error",		"Prefix": "[Prefix] ",		"StacktraceLevel": "fatal",		"WriterOption": {			"Compress": false,			"CompressionLevel": 4,			"DailyRotate": false,			"FileName": "$FILENAME-1",			"LogRotate": false,			"MaxDays": 90,			"MaxSize": 2		},		"WriterType": "file"	}}` 	dump := manager.GetLogger(log.DEFAULT).DumpWriters()	expected := writerDump	expected = strings.ReplaceAll(expected, "$FILENAME-0", tempPath("gitea.log"))	expected = strings.ReplaceAll(expected, "$FILENAME-1", tempPath("file-xxx.log"))	require.JSONEq(t, expected, toJSON(dump))} func TestLegacyLoggerMigrations(t *testing.T) {	type Cases = []struct {		name string		cfg  string		exp  string	} 	runCases := func(t *testing.T, key string, cases Cases) {		for _, c := range cases {			t.Run(c.name, func(t *testing.T) {				cfg := initLoggerConfig(t, c.cfg)				require.Equal(t, c.exp, cfg.Section("log").Key(key).String())			})		}	} 	t.Run("default", func(t *testing.T) {		runCases(t, "LOGGER_DEFAULT_MODE", Cases{			{				"uses default value for default logger",				"",				",",			},			{				"uses logger.default.MODE for default logger",				`[log]logger.default.MODE = file`,				"file",			},		})	}) 	t.Run("access", func(t *testing.T) {		runCases(t, "LOGGER_ACCESS_MODE", Cases{			{				"uses default value for access logger",				"",				"",			},			{				"uses ACCESS for access logger",				`[log]ACCESS = file`,				"file",			},			{				"ENABLE_ACCESS_LOG=true doesn't change access logger",				`[log]ENABLE_ACCESS_LOG = truelogger.access.MODE = console`,				"console",			},			{				"ENABLE_ACCESS_LOG=false disables access logger",				`[log]ENABLE_ACCESS_LOG = falselogger.access.MODE = console`,				"",			},			{				"logger.access.MODE has precedence over ACCESS for access logger",				`[log]ACCESS = filelogger.access.MODE = console`,				"console",			},			{				"LOGGER_ACCESS_MODE has precedence over logger.access.MODE for access logger",				`[log]LOGGER_ACCESS_MODE = filelogger.access.MODE = console`,				"file",			},			{				"ENABLE_ACCESS_LOG doesn't enable access logger",				`[log]ENABLE_ACCESS_LOG = true`,				"", // should be `,`			},		})	}) 	t.Run("router", func(t *testing.T) {		runCases(t, "LOGGER_ROUTER_MODE", Cases{			{				"uses default value for router logger",				"",

Lines 1–500 of 593.