mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2025-07-07 09:55:41 +02:00
Some checks are pending
/ release (push) Waiting to run
testing-integration / test-unit (push) Waiting to run
testing-integration / test-sqlite (push) Waiting to run
testing / backend-checks (push) Waiting to run
testing / frontend-checks (push) Waiting to run
testing / test-unit (push) Blocked by required conditions
testing / test-e2e (push) Blocked by required conditions
testing / test-remote-cacher (redis) (push) Blocked by required conditions
testing / test-remote-cacher (valkey) (push) Blocked by required conditions
testing / test-remote-cacher (garnet) (push) Blocked by required conditions
testing / test-remote-cacher (redict) (push) Blocked by required conditions
testing / test-mysql (push) Blocked by required conditions
testing / test-pgsql (push) Blocked by required conditions
testing / test-sqlite (push) Blocked by required conditions
testing / security-check (push) Blocked by required conditions
This feature is intended to help reduce noisy logs generated by routine Kubernetes probes and Prometheus scraping. While logs are essential, these specific requests (e.g., to /metrics and /api/healthz) generally don't provide useful information and tend to clutter the output. The goal is to introduce functionality that effectively acts as the inverse of the existing EXPRESSION mode—allowing logging to be excluded based on a condition, rather than included. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8212 Reviewed-by: Gusted <gusted@noreply.codeberg.org> Co-authored-by: zokki <zokki.softwareschmiede@gmail.com> Co-committed-by: zokki <zokki.softwareschmiede@gmail.com>
397 lines
7.9 KiB
Go
397 lines
7.9 KiB
Go
// 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": "",
|
|
"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 = file
|
|
ROUTER = file
|
|
ACCESS = 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 = file
|
|
ACCESS = file
|
|
DISABLE_ROUTER_LOG = true
|
|
ENABLE_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 = console
|
|
logger.xorm.MODE = console, console-1
|
|
|
|
[log.console]
|
|
LEVEL = warn
|
|
|
|
[log.console-1]
|
|
MODE = console
|
|
LEVEL = error
|
|
STDERR = 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 = 10
|
|
MODE = file, file1
|
|
|
|
[log.file1]
|
|
MODE = file
|
|
LEVEL = error
|
|
STACKTRACE_LEVEL = fatal
|
|
EXPRESSION = filter
|
|
EXCLUSION = not
|
|
FLAGS = medfile
|
|
PREFIX = "[Prefix] "
|
|
FILE_NAME = file-xxx.log
|
|
LOG_ROTATE = false
|
|
MAX_SIZE_SHIFT = 1
|
|
DAILY_ROTATE = false
|
|
MAX_DAYS = 90
|
|
COMPRESS = false
|
|
COMPRESSION_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))
|
|
}
|