You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

log_test.go 7.7KB

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