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

file_test.go 7.7 kB

Better logging (#6038) (#6095) * Panic don't fatal on create new logger Fixes #5854 Signed-off-by: Andrew Thornton <art27@cantab.net> * partial broken * Update the logging infrastrcture Signed-off-by: Andrew Thornton <art27@cantab.net> * Reset the skip levels for Fatal and Error Signed-off-by: Andrew Thornton <art27@cantab.net> * broken ncsa * More log.Error fixes Signed-off-by: Andrew Thornton <art27@cantab.net> * Remove nal * set log-levels to lowercase * Make console_test test all levels * switch to lowercased levels * OK now working * Fix vetting issues * Fix lint * Fix tests * change default logging to match current gitea * Improve log testing Signed-off-by: Andrew Thornton <art27@cantab.net> * reset error skip levels to 0 * Update documentation and access logger configuration * Redirect the router log back to gitea if redirect macaron log but also allow setting the log level - i.e. TRACE * Fix broken level caching * Refactor the router log * Add Router logger * Add colorizing options * Adjust router colors * Only create logger if they will be used * update app.ini.sample * rename Attribute ColorAttribute * Change from white to green for function * Set fatal/error levels * Restore initial trace logger * Fix Trace arguments in modules/auth/auth.go * Properly handle XORMLogger * Improve admin/config page * fix fmt * Add auto-compression of old logs * Update error log levels * Remove the unnecessary skip argument from Error, Fatal and Critical * Add stacktrace support * Fix tests * Remove x/sync from vendors? * Add stderr option to console logger * Use filepath.ToSlash to protect against Windows in tests * Remove prefixed underscores from names in colors.go * Remove not implemented database logger This was removed from Gogs on 4 Mar 2016 but left in the configuration since then. * Ensure that log paths are relative to ROOT_PATH * use path.Join * rename jsonConfig to logConfig * Rename "config" to "jsonConfig" to make it clearer * Requested changes * Requested changes: XormLogger * Try to color the windows terminal If successful default to colorizing the console logs * fixup * Colorize initially too * update vendor * Colorize logs on default and remove if this is not a colorizing logger * Fix documentation * fix test * Use go-isatty to detect if on windows we are on msys or cygwin * Fix spelling mistake * Add missing vendors * More changes * Rationalise the ANSI writer protection * Adjust colors on advice from @0x5c * Make Flags a comma separated list * Move to use the windows constant for ENABLE_VIRTUAL_TERMINAL_PROCESSING * Ensure matching is done on the non-colored message - to simpify EXPRESSION
7 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package log
  5. import (
  6. "compress/gzip"
  7. "fmt"
  8. "io/ioutil"
  9. "os"
  10. "path/filepath"
  11. "strings"
  12. "testing"
  13. "time"
  14. "github.com/stretchr/testify/assert"
  15. )
  16. func TestFileLoggerFails(t *testing.T) {
  17. tmpDir, err := ioutil.TempDir("", "TestFileLogger")
  18. assert.NoError(t, err)
  19. defer os.RemoveAll(tmpDir)
  20. prefix := "TestPrefix "
  21. level := INFO
  22. flags := LstdFlags | LUTC | Lfuncname
  23. //filename := filepath.Join(tmpDir, "test.log")
  24. fileLogger := NewFileLogger()
  25. //realFileLogger, ok := fileLogger.(*FileLogger)
  26. //assert.Equal(t, true, ok)
  27. // Fail if there is bad json
  28. err = fileLogger.Init("{")
  29. assert.Error(t, err)
  30. // Fail if there is no filename
  31. err = fileLogger.Init(fmt.Sprintf("{\"prefix\":\"%s\",\"level\":\"%s\",\"flags\":%d,\"filename\":\"%s\"}", prefix, level.String(), flags, ""))
  32. assert.Error(t, err)
  33. // Fail if the file isn't a filename
  34. err = fileLogger.Init(fmt.Sprintf("{\"prefix\":\"%s\",\"level\":\"%s\",\"flags\":%d,\"filename\":\"%s\"}", prefix, level.String(), flags, filepath.ToSlash(tmpDir)))
  35. assert.Error(t, err)
  36. }
  37. func TestFileLogger(t *testing.T) {
  38. tmpDir, err := ioutil.TempDir("", "TestFileLogger")
  39. assert.NoError(t, err)
  40. defer os.RemoveAll(tmpDir)
  41. prefix := "TestPrefix "
  42. level := INFO
  43. flags := LstdFlags | LUTC | Lfuncname
  44. filename := filepath.Join(tmpDir, "test.log")
  45. fileLogger := NewFileLogger()
  46. realFileLogger, ok := fileLogger.(*FileLogger)
  47. assert.Equal(t, true, ok)
  48. location, _ := time.LoadLocation("EST")
  49. date := time.Date(2019, time.January, 13, 22, 3, 30, 15, location)
  50. dateString := date.UTC().Format("2006/01/02 15:04:05")
  51. event := Event{
  52. level: INFO,
  53. msg: "TEST MSG",
  54. caller: "CALLER",
  55. filename: "FULL/FILENAME",
  56. line: 1,
  57. time: date,
  58. }
  59. expected := fmt.Sprintf("%s%s %s:%d:%s [%c] %s\n", prefix, dateString, event.filename, event.line, event.caller, strings.ToUpper(event.level.String())[0], event.msg)
  60. fileLogger.Init(fmt.Sprintf("{\"prefix\":\"%s\",\"level\":\"%s\",\"flags\":%d,\"filename\":\"%s\",\"maxsize\":%d,\"compress\":false}", prefix, level.String(), flags, filepath.ToSlash(filename), len(expected)*2))
  61. assert.Equal(t, flags, realFileLogger.Flags)
  62. assert.Equal(t, level, realFileLogger.Level)
  63. assert.Equal(t, level, fileLogger.GetLevel())
  64. fileLogger.LogEvent(&event)
  65. fileLogger.Flush()
  66. logData, err := ioutil.ReadFile(filename)
  67. assert.NoError(t, err)
  68. assert.Equal(t, expected, string(logData))
  69. event.level = DEBUG
  70. expected = expected + ""
  71. fileLogger.LogEvent(&event)
  72. fileLogger.Flush()
  73. logData, err = ioutil.ReadFile(filename)
  74. assert.NoError(t, err)
  75. assert.Equal(t, expected, string(logData))
  76. event.level = TRACE
  77. expected = expected + ""
  78. fileLogger.LogEvent(&event)
  79. fileLogger.Flush()
  80. logData, err = ioutil.ReadFile(filename)
  81. assert.NoError(t, err)
  82. assert.Equal(t, expected, string(logData))
  83. event.level = WARN
  84. expected = expected + fmt.Sprintf("%s%s %s:%d:%s [%c] %s\n", prefix, dateString, event.filename, event.line, event.caller, strings.ToUpper(event.level.String())[0], event.msg)
  85. fileLogger.LogEvent(&event)
  86. fileLogger.Flush()
  87. logData, err = ioutil.ReadFile(filename)
  88. assert.NoError(t, err)
  89. assert.Equal(t, expected, string(logData))
  90. // Should rotate
  91. fileLogger.LogEvent(&event)
  92. fileLogger.Flush()
  93. logData, err = ioutil.ReadFile(filename + fmt.Sprintf(".%s.%03d", time.Now().Format("2006-01-02"), 1))
  94. assert.NoError(t, err)
  95. assert.Equal(t, expected, string(logData))
  96. logData, err = ioutil.ReadFile(filename)
  97. assert.NoError(t, err)
  98. expected = fmt.Sprintf("%s%s %s:%d:%s [%c] %s\n", prefix, dateString, event.filename, event.line, event.caller, strings.ToUpper(event.level.String())[0], event.msg)
  99. assert.Equal(t, expected, string(logData))
  100. for num := 2; num <= 999; num++ {
  101. file, err := os.OpenFile(filename+fmt.Sprintf(".%s.%03d", time.Now().Format("2006-01-02"), num), os.O_RDONLY|os.O_CREATE, 0666)
  102. assert.NoError(t, err)
  103. file.Close()
  104. }
  105. err = realFileLogger.DoRotate()
  106. assert.Error(t, err)
  107. expected = expected + fmt.Sprintf("%s%s %s:%d:%s [%c] %s\n", prefix, dateString, event.filename, event.line, event.caller, strings.ToUpper(event.level.String())[0], event.msg)
  108. fileLogger.LogEvent(&event)
  109. fileLogger.Flush()
  110. logData, err = ioutil.ReadFile(filename)
  111. assert.NoError(t, err)
  112. assert.Equal(t, expected, string(logData))
  113. // Should fail to rotate
  114. expected = expected + fmt.Sprintf("%s%s %s:%d:%s [%c] %s\n", prefix, dateString, event.filename, event.line, event.caller, strings.ToUpper(event.level.String())[0], event.msg)
  115. fileLogger.LogEvent(&event)
  116. fileLogger.Flush()
  117. logData, err = ioutil.ReadFile(filename)
  118. assert.NoError(t, err)
  119. assert.Equal(t, expected, string(logData))
  120. fileLogger.Close()
  121. }
  122. func TestCompressFileLogger(t *testing.T) {
  123. tmpDir, err := ioutil.TempDir("", "TestFileLogger")
  124. assert.NoError(t, err)
  125. defer os.RemoveAll(tmpDir)
  126. prefix := "TestPrefix "
  127. level := INFO
  128. flags := LstdFlags | LUTC | Lfuncname
  129. filename := filepath.Join(tmpDir, "test.log")
  130. fileLogger := NewFileLogger()
  131. realFileLogger, ok := fileLogger.(*FileLogger)
  132. assert.Equal(t, true, ok)
  133. location, _ := time.LoadLocation("EST")
  134. date := time.Date(2019, time.January, 13, 22, 3, 30, 15, location)
  135. dateString := date.UTC().Format("2006/01/02 15:04:05")
  136. event := Event{
  137. level: INFO,
  138. msg: "TEST MSG",
  139. caller: "CALLER",
  140. filename: "FULL/FILENAME",
  141. line: 1,
  142. time: date,
  143. }
  144. expected := fmt.Sprintf("%s%s %s:%d:%s [%c] %s\n", prefix, dateString, event.filename, event.line, event.caller, strings.ToUpper(event.level.String())[0], event.msg)
  145. fileLogger.Init(fmt.Sprintf("{\"prefix\":\"%s\",\"level\":\"%s\",\"flags\":%d,\"filename\":\"%s\",\"maxsize\":%d,\"compress\":true}", prefix, level.String(), flags, filepath.ToSlash(filename), len(expected)*2))
  146. fileLogger.LogEvent(&event)
  147. fileLogger.Flush()
  148. logData, err := ioutil.ReadFile(filename)
  149. assert.NoError(t, err)
  150. assert.Equal(t, expected, string(logData))
  151. event.level = WARN
  152. expected = expected + fmt.Sprintf("%s%s %s:%d:%s [%c] %s\n", prefix, dateString, event.filename, event.line, event.caller, strings.ToUpper(event.level.String())[0], event.msg)
  153. fileLogger.LogEvent(&event)
  154. fileLogger.Flush()
  155. logData, err = ioutil.ReadFile(filename)
  156. assert.NoError(t, err)
  157. assert.Equal(t, expected, string(logData))
  158. // Should rotate
  159. fileLogger.LogEvent(&event)
  160. fileLogger.Flush()
  161. for num := 2; num <= 999; num++ {
  162. file, err := os.OpenFile(filename+fmt.Sprintf(".%s.%03d.gz", time.Now().Format("2006-01-02"), num), os.O_RDONLY|os.O_CREATE, 0666)
  163. assert.NoError(t, err)
  164. file.Close()
  165. }
  166. err = realFileLogger.DoRotate()
  167. assert.Error(t, err)
  168. }
  169. func TestCompressOldFile(t *testing.T) {
  170. tmpDir, err := ioutil.TempDir("", "TestFileLogger")
  171. assert.NoError(t, err)
  172. defer os.RemoveAll(tmpDir)
  173. fname := filepath.Join(tmpDir, "test")
  174. nonGzip := filepath.Join(tmpDir, "test-nonGzip")
  175. f, err := os.OpenFile(fname, os.O_CREATE|os.O_WRONLY, 0660)
  176. assert.NoError(t, err)
  177. ng, err := os.OpenFile(nonGzip, os.O_CREATE|os.O_WRONLY, 0660)
  178. assert.NoError(t, err)
  179. for i := 0; i < 999; i++ {
  180. f.WriteString("This is a test file\n")
  181. ng.WriteString("This is a test file\n")
  182. }
  183. f.Close()
  184. ng.Close()
  185. err = compressOldLogFile(fname, -1)
  186. assert.NoError(t, err)
  187. _, err = os.Lstat(fname + ".gz")
  188. assert.NoError(t, err)
  189. f, err = os.Open(fname + ".gz")
  190. assert.NoError(t, err)
  191. zr, err := gzip.NewReader(f)
  192. assert.NoError(t, err)
  193. data, err := ioutil.ReadAll(zr)
  194. assert.NoError(t, err)
  195. original, err := ioutil.ReadFile(nonGzip)
  196. assert.NoError(t, err)
  197. assert.Equal(t, original, data)
  198. }