log.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. // Copyright 2020 The Gogs 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 conf
  5. import (
  6. "os"
  7. "path/filepath"
  8. "strings"
  9. log "unknwon.dev/clog/v2"
  10. )
  11. // Log settings
  12. var Log struct {
  13. RootPath string
  14. Modes []string
  15. Configs []interface{}
  16. }
  17. // InitLogging initializes the logging service of the application.
  18. func InitLogging() {
  19. Log.RootPath = File.Section("log").Key("ROOT_PATH").MustString(filepath.Join(WorkDir(), "log"))
  20. // Because we always create a console logger as the primary logger at init time,
  21. // we need to remove it in case the user doesn't configure to use it after the
  22. // logging service is initalized.
  23. hasConsole := false
  24. // Iterate over [log.*] sections to initialize individual logger.
  25. Log.Modes = strings.Split(File.Section("log").Key("MODE").MustString("console"), ",")
  26. Log.Configs = make([]interface{}, 0, len(Log.Modes))
  27. levelMappings := map[string]log.Level{
  28. "trace": log.LevelTrace,
  29. "info": log.LevelInfo,
  30. "warn": log.LevelWarn,
  31. "error": log.LevelError,
  32. "fatal": log.LevelFatal,
  33. }
  34. type config struct {
  35. Buffer int64
  36. Config interface{}
  37. }
  38. for _, mode := range Log.Modes {
  39. mode = strings.ToLower(strings.TrimSpace(mode))
  40. secName := "log." + mode
  41. sec, err := File.GetSection(secName)
  42. if err != nil {
  43. log.Fatal("Missing configuration section [%s] for %q logger", secName, mode)
  44. return
  45. }
  46. level := levelMappings[strings.ToLower(sec.Key("LEVEL").MustString("trace"))]
  47. buffer := sec.Key("BUFFER_LEN").MustInt64(100)
  48. var c *config
  49. switch mode {
  50. case log.DefaultConsoleName:
  51. hasConsole = true
  52. c = &config{
  53. Buffer: buffer,
  54. Config: log.ConsoleConfig{
  55. Level: level,
  56. },
  57. }
  58. err = log.NewConsole(c.Buffer, c.Config)
  59. case log.DefaultFileName:
  60. logPath := filepath.Join(Log.RootPath, "gogs.log")
  61. logDir := filepath.Dir(logPath)
  62. err = os.MkdirAll(logDir, os.ModePerm)
  63. if err != nil {
  64. log.Fatal("Failed to create log directory %q: %v", logDir, err)
  65. return
  66. }
  67. c = &config{
  68. Buffer: buffer,
  69. Config: log.FileConfig{
  70. Level: level,
  71. Filename: logPath,
  72. FileRotationConfig: log.FileRotationConfig{
  73. Rotate: sec.Key("LOG_ROTATE").MustBool(true),
  74. Daily: sec.Key("DAILY_ROTATE").MustBool(true),
  75. MaxSize: 1 << uint(sec.Key("MAX_SIZE_SHIFT").MustInt(28)),
  76. MaxLines: sec.Key("MAX_LINES").MustInt64(1000000),
  77. MaxDays: sec.Key("MAX_DAYS").MustInt64(7),
  78. },
  79. },
  80. }
  81. err = log.NewFile(c.Buffer, c.Config)
  82. case log.DefaultSlackName:
  83. c = &config{
  84. Buffer: buffer,
  85. Config: log.SlackConfig{
  86. Level: level,
  87. URL: sec.Key("URL").String(),
  88. },
  89. }
  90. err = log.NewSlack(c.Buffer, c.Config)
  91. case log.DefaultDiscordName:
  92. c = &config{
  93. Buffer: buffer,
  94. Config: log.DiscordConfig{
  95. Level: level,
  96. URL: sec.Key("URL").String(),
  97. Username: sec.Key("USERNAME").String(),
  98. },
  99. }
  100. err = log.NewDiscord(c.Buffer, c.Config)
  101. default:
  102. continue
  103. }
  104. if err != nil {
  105. log.Fatal("Failed to init %s logger: %v", mode, err)
  106. return
  107. }
  108. Log.Configs = append(Log.Configs, c)
  109. log.Trace("Log mode: %s (%s)", strings.Title(mode), strings.Title(strings.ToLower(level.String())))
  110. }
  111. if !hasConsole {
  112. log.Remove(log.DefaultConsoleName)
  113. }
  114. }