code.gitea.io/gitea@v1.22.3/modules/setting/log_test.go (about)

     1  // Copyright 2019 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package setting
     5  
     6  import (
     7  	"path/filepath"
     8  	"strings"
     9  	"testing"
    10  
    11  	"code.gitea.io/gitea/modules/json"
    12  	"code.gitea.io/gitea/modules/log"
    13  
    14  	"github.com/stretchr/testify/assert"
    15  	"github.com/stretchr/testify/require"
    16  )
    17  
    18  func initLoggersByConfig(t *testing.T, config string) (*log.LoggerManager, func()) {
    19  	oldLogConfig := Log
    20  	Log = LogGlobalConfig{}
    21  	defer func() {
    22  		Log = oldLogConfig
    23  	}()
    24  
    25  	cfg, err := NewConfigProviderFromData(config)
    26  	assert.NoError(t, err)
    27  
    28  	manager := log.NewManager()
    29  	initManagedLoggers(manager, cfg)
    30  	return manager, manager.Close
    31  }
    32  
    33  func toJSON(v any) string {
    34  	b, _ := json.MarshalIndent(v, "", "\t")
    35  	return string(b)
    36  }
    37  
    38  func TestLogConfigDefault(t *testing.T) {
    39  	manager, managerClose := initLoggersByConfig(t, ``)
    40  	defer managerClose()
    41  
    42  	writerDump := `
    43  {
    44  	"console": {
    45  		"BufferLen": 10000,
    46  		"Colorize": false,
    47  		"Expression": "",
    48  		"Flags": "stdflags",
    49  		"Level": "info",
    50  		"Prefix": "",
    51  		"StacktraceLevel": "none",
    52  		"WriterOption": {
    53  			"Stderr": false
    54  		},
    55  		"WriterType": "console"
    56  	}
    57  }
    58  `
    59  
    60  	dump := manager.GetLogger(log.DEFAULT).DumpWriters()
    61  	require.JSONEq(t, writerDump, toJSON(dump))
    62  
    63  	dump = manager.GetLogger("access").DumpWriters()
    64  	require.JSONEq(t, "{}", toJSON(dump))
    65  
    66  	dump = manager.GetLogger("router").DumpWriters()
    67  	require.JSONEq(t, writerDump, toJSON(dump))
    68  
    69  	dump = manager.GetLogger("xorm").DumpWriters()
    70  	require.JSONEq(t, writerDump, toJSON(dump))
    71  }
    72  
    73  func TestLogConfigDisable(t *testing.T) {
    74  	manager, managerClose := initLoggersByConfig(t, `
    75  [log]
    76  logger.router.MODE =
    77  logger.xorm.MODE =
    78  `)
    79  	defer managerClose()
    80  
    81  	writerDump := `
    82  {
    83  	"console": {
    84  		"BufferLen": 10000,
    85  		"Colorize": false,
    86  		"Expression": "",
    87  		"Flags": "stdflags",
    88  		"Level": "info",
    89  		"Prefix": "",
    90  		"StacktraceLevel": "none",
    91  		"WriterOption": {
    92  			"Stderr": false
    93  		},
    94  		"WriterType": "console"
    95  	}
    96  }
    97  `
    98  
    99  	dump := manager.GetLogger(log.DEFAULT).DumpWriters()
   100  	require.JSONEq(t, writerDump, toJSON(dump))
   101  
   102  	dump = manager.GetLogger("access").DumpWriters()
   103  	require.JSONEq(t, "{}", toJSON(dump))
   104  
   105  	dump = manager.GetLogger("router").DumpWriters()
   106  	require.JSONEq(t, "{}", toJSON(dump))
   107  
   108  	dump = manager.GetLogger("xorm").DumpWriters()
   109  	require.JSONEq(t, "{}", toJSON(dump))
   110  }
   111  
   112  func TestLogConfigLegacyDefault(t *testing.T) {
   113  	manager, managerClose := initLoggersByConfig(t, `
   114  [log]
   115  MODE = console
   116  `)
   117  	defer managerClose()
   118  
   119  	writerDump := `
   120  {
   121  	"console": {
   122  		"BufferLen": 10000,
   123  		"Colorize": false,
   124  		"Expression": "",
   125  		"Flags": "stdflags",
   126  		"Level": "info",
   127  		"Prefix": "",
   128  		"StacktraceLevel": "none",
   129  		"WriterOption": {
   130  			"Stderr": false
   131  		},
   132  		"WriterType": "console"
   133  	}
   134  }
   135  `
   136  
   137  	dump := manager.GetLogger(log.DEFAULT).DumpWriters()
   138  	require.JSONEq(t, writerDump, toJSON(dump))
   139  
   140  	dump = manager.GetLogger("access").DumpWriters()
   141  	require.JSONEq(t, "{}", toJSON(dump))
   142  
   143  	dump = manager.GetLogger("router").DumpWriters()
   144  	require.JSONEq(t, writerDump, toJSON(dump))
   145  
   146  	dump = manager.GetLogger("xorm").DumpWriters()
   147  	require.JSONEq(t, writerDump, toJSON(dump))
   148  }
   149  
   150  func TestLogConfigLegacyMode(t *testing.T) {
   151  	tempDir := t.TempDir()
   152  
   153  	tempPath := func(file string) string {
   154  		return filepath.Join(tempDir, file)
   155  	}
   156  
   157  	manager, managerClose := initLoggersByConfig(t, `
   158  [log]
   159  ROOT_PATH = `+tempDir+`
   160  MODE = file
   161  ROUTER = file
   162  ACCESS = file
   163  `)
   164  	defer managerClose()
   165  
   166  	writerDump := `
   167  {
   168  	"file": {
   169  		"BufferLen": 10000,
   170  		"Colorize": false,
   171  		"Expression": "",
   172  		"Flags": "stdflags",
   173  		"Level": "info",
   174  		"Prefix": "",
   175  		"StacktraceLevel": "none",
   176  		"WriterOption": {
   177  			"Compress": true,
   178  			"CompressionLevel": -1,
   179  			"DailyRotate": true,
   180  			"FileName": "$FILENAME",
   181  			"LogRotate": true,
   182  			"MaxDays": 7,
   183  			"MaxSize": 268435456
   184  		},
   185  		"WriterType": "file"
   186  	}
   187  }
   188  `
   189  	writerDumpAccess := `
   190  {
   191  	"file.access": {
   192  		"BufferLen": 10000,
   193  		"Colorize": false,
   194  		"Expression": "",
   195  		"Flags": "none",
   196  		"Level": "info",
   197  		"Prefix": "",
   198  		"StacktraceLevel": "none",
   199  		"WriterOption": {
   200  			"Compress": true,
   201  			"CompressionLevel": -1,
   202  			"DailyRotate": true,
   203  			"FileName": "$FILENAME",
   204  			"LogRotate": true,
   205  			"MaxDays": 7,
   206  			"MaxSize": 268435456
   207  		},
   208  		"WriterType": "file"
   209  	}
   210  }
   211  `
   212  	dump := manager.GetLogger(log.DEFAULT).DumpWriters()
   213  	require.JSONEq(t, strings.ReplaceAll(writerDump, "$FILENAME", tempPath("gitea.log")), toJSON(dump))
   214  
   215  	dump = manager.GetLogger("access").DumpWriters()
   216  	require.JSONEq(t, strings.ReplaceAll(writerDumpAccess, "$FILENAME", tempPath("access.log")), toJSON(dump))
   217  
   218  	dump = manager.GetLogger("router").DumpWriters()
   219  	require.JSONEq(t, strings.ReplaceAll(writerDump, "$FILENAME", tempPath("gitea.log")), toJSON(dump))
   220  }
   221  
   222  func TestLogConfigLegacyModeDisable(t *testing.T) {
   223  	manager, managerClose := initLoggersByConfig(t, `
   224  [log]
   225  ROUTER = file
   226  ACCESS = file
   227  DISABLE_ROUTER_LOG = true
   228  ENABLE_ACCESS_LOG = false
   229  `)
   230  	defer managerClose()
   231  
   232  	dump := manager.GetLogger("access").DumpWriters()
   233  	require.JSONEq(t, "{}", toJSON(dump))
   234  
   235  	dump = manager.GetLogger("router").DumpWriters()
   236  	require.JSONEq(t, "{}", toJSON(dump))
   237  }
   238  
   239  func TestLogConfigNewConfig(t *testing.T) {
   240  	manager, managerClose := initLoggersByConfig(t, `
   241  [log]
   242  logger.access.MODE = console
   243  logger.xorm.MODE = console, console-1
   244  
   245  [log.console]
   246  LEVEL = warn
   247  
   248  [log.console-1]
   249  MODE = console
   250  LEVEL = error
   251  STDERR = true
   252  `)
   253  	defer managerClose()
   254  
   255  	writerDump := `
   256  {
   257  	"console": {
   258  		"BufferLen": 10000,
   259  		"Colorize": false,
   260  		"Expression": "",
   261  		"Flags": "stdflags",
   262  		"Level": "warn",
   263  		"Prefix": "",
   264  		"StacktraceLevel": "none",
   265  		"WriterOption": {
   266  			"Stderr": false
   267  		},
   268  		"WriterType": "console"
   269  	},
   270  	"console-1": {
   271  		"BufferLen": 10000,
   272  		"Colorize": false,
   273  		"Expression": "",
   274  		"Flags": "stdflags",
   275  		"Level": "error",
   276  		"Prefix": "",
   277  		"StacktraceLevel": "none",
   278  		"WriterOption": {
   279  			"Stderr": true
   280  		},
   281  		"WriterType": "console"
   282  	}
   283  }
   284  `
   285  	writerDumpAccess := `
   286  {
   287  	"console.access": {
   288  		"BufferLen": 10000,
   289  		"Colorize": false,
   290  		"Expression": "",
   291  		"Flags": "none",
   292  		"Level": "warn",
   293  		"Prefix": "",
   294  		"StacktraceLevel": "none",
   295  		"WriterOption": {
   296  			"Stderr": false
   297  		},
   298  		"WriterType": "console"
   299  	}
   300  }
   301  `
   302  	dump := manager.GetLogger("xorm").DumpWriters()
   303  	require.JSONEq(t, writerDump, toJSON(dump))
   304  
   305  	dump = manager.GetLogger("access").DumpWriters()
   306  	require.JSONEq(t, writerDumpAccess, toJSON(dump))
   307  }
   308  
   309  func TestLogConfigModeFile(t *testing.T) {
   310  	tempDir := t.TempDir()
   311  
   312  	tempPath := func(file string) string {
   313  		return filepath.Join(tempDir, file)
   314  	}
   315  
   316  	manager, managerClose := initLoggersByConfig(t, `
   317  [log]
   318  ROOT_PATH = `+tempDir+`
   319  BUFFER_LEN = 10
   320  MODE = file, file1
   321  
   322  [log.file1]
   323  MODE = file
   324  LEVEL = error
   325  STACKTRACE_LEVEL = fatal
   326  EXPRESSION = filter
   327  FLAGS = medfile
   328  PREFIX = "[Prefix] "
   329  FILE_NAME = file-xxx.log
   330  LOG_ROTATE = false
   331  MAX_SIZE_SHIFT = 1
   332  DAILY_ROTATE = false
   333  MAX_DAYS = 90
   334  COMPRESS = false
   335  COMPRESSION_LEVEL = 4
   336  `)
   337  	defer managerClose()
   338  
   339  	writerDump := `
   340  {
   341  	"file": {
   342  		"BufferLen": 10,
   343  		"Colorize": false,
   344  		"Expression": "",
   345  		"Flags": "stdflags",
   346  		"Level": "info",
   347  		"Prefix": "",
   348  		"StacktraceLevel": "none",
   349  		"WriterOption": {
   350  			"Compress": true,
   351  			"CompressionLevel": -1,
   352  			"DailyRotate": true,
   353  			"FileName": "$FILENAME-0",
   354  			"LogRotate": true,
   355  			"MaxDays": 7,
   356  			"MaxSize": 268435456
   357  		},
   358  		"WriterType": "file"
   359  	},
   360  	"file1": {
   361  		"BufferLen": 10,
   362  		"Colorize": false,
   363  		"Expression": "filter",
   364  		"Flags": "medfile",
   365  		"Level": "error",
   366  		"Prefix": "[Prefix] ",
   367  		"StacktraceLevel": "fatal",
   368  		"WriterOption": {
   369  			"Compress": false,
   370  			"CompressionLevel": 4,
   371  			"DailyRotate": false,
   372  			"FileName": "$FILENAME-1",
   373  			"LogRotate": false,
   374  			"MaxDays": 90,
   375  			"MaxSize": 2
   376  		},
   377  		"WriterType": "file"
   378  	}
   379  }
   380  `
   381  
   382  	dump := manager.GetLogger(log.DEFAULT).DumpWriters()
   383  	expected := writerDump
   384  	expected = strings.ReplaceAll(expected, "$FILENAME-0", tempPath("gitea.log"))
   385  	expected = strings.ReplaceAll(expected, "$FILENAME-1", tempPath("file-xxx.log"))
   386  	require.JSONEq(t, expected, toJSON(dump))
   387  }