386 lines · 7.7 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" 	"github.com/stretchr/testify/require") func initLoggersByConfig(t *testing.T, config string) (*log.LoggerManager, func()) {	oldLogConfig := Log	Log = LogGlobalConfig{}	defer func() {		Log = oldLogConfig	}() 	cfg, err := NewConfigProviderFromData(config)	require.NoError(t, err) 	manager := log.NewManager()	initManagedLoggers(manager, cfg)	return manager, manager.Close} 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": "",		"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": "",		"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": "",		"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": "",		"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": "",		"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": "",		"Flags": "stdflags",		"Level": "warn",		"Prefix": "",		"StacktraceLevel": "none",		"WriterOption": {			"Stderr": false		},		"WriterType": "console"	},	"console-1": {		"BufferLen": 10000,		"Colorize": false,		"Expression": "",		"Flags": "stdflags",		"Level": "error",		"Prefix": "",		"StacktraceLevel": "none",		"WriterOption": {			"Stderr": true		},		"WriterType": "console"	}}`	writerDumpAccess := `{	"console.access": {		"BufferLen": 10000,		"Colorize": false,		"Expression": "",		"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 = filterFLAGS = 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": "",		"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",		"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))}