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.

log.go 5.8 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  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 setting
  5. import (
  6. "fmt"
  7. "os"
  8. "path"
  9. "path/filepath"
  10. "strings"
  11. "code.gitea.io/gitea/modules/log"
  12. "github.com/go-xorm/core"
  13. )
  14. var logLevels = map[string]string{
  15. "Trace": "0",
  16. "Debug": "1",
  17. "Info": "2",
  18. "Warn": "3",
  19. "Error": "4",
  20. "Critical": "5",
  21. }
  22. func getLogLevel(section string, key string, defaultValue string) string {
  23. validLevels := []string{"Trace", "Debug", "Info", "Warn", "Error", "Critical"}
  24. return Cfg.Section(section).Key(key).In(defaultValue, validLevels)
  25. }
  26. func newLogService() {
  27. log.Info("Gitea v%s%s", AppVer, AppBuiltWith)
  28. LogModes = strings.Split(Cfg.Section("log").Key("MODE").MustString("console"), ",")
  29. LogConfigs = make([]string, len(LogModes))
  30. useConsole := false
  31. for i := 0; i < len(LogModes); i++ {
  32. LogModes[i] = strings.TrimSpace(LogModes[i])
  33. if LogModes[i] == "console" {
  34. useConsole = true
  35. }
  36. }
  37. if !useConsole {
  38. log.DelLogger("console")
  39. }
  40. for i, mode := range LogModes {
  41. sec, err := Cfg.GetSection("log." + mode)
  42. if err != nil {
  43. sec, _ = Cfg.NewSection("log." + mode)
  44. }
  45. // Log level.
  46. levelName := getLogLevel("log."+mode, "LEVEL", LogLevel)
  47. level, ok := logLevels[levelName]
  48. if !ok {
  49. log.Fatal(4, "Unknown log level: %s", levelName)
  50. }
  51. // Generate log configuration.
  52. switch mode {
  53. case "console":
  54. LogConfigs[i] = fmt.Sprintf(`{"level":%s}`, level)
  55. case "file":
  56. logPath := sec.Key("FILE_NAME").MustString(path.Join(LogRootPath, "gitea.log"))
  57. if err = os.MkdirAll(path.Dir(logPath), os.ModePerm); err != nil {
  58. panic(err.Error())
  59. }
  60. LogConfigs[i] = fmt.Sprintf(
  61. `{"level":%s,"filename":"%s","rotate":%v,"maxsize":%d,"daily":%v,"maxdays":%d}`, level,
  62. logPath,
  63. sec.Key("LOG_ROTATE").MustBool(true),
  64. 1<<uint(sec.Key("MAX_SIZE_SHIFT").MustInt(28)),
  65. sec.Key("DAILY_ROTATE").MustBool(true),
  66. sec.Key("MAX_DAYS").MustInt(7))
  67. case "conn":
  68. LogConfigs[i] = fmt.Sprintf(`{"level":%s,"reconnectOnMsg":%v,"reconnect":%v,"net":"%s","addr":"%s"}`, level,
  69. sec.Key("RECONNECT_ON_MSG").MustBool(),
  70. sec.Key("RECONNECT").MustBool(),
  71. sec.Key("PROTOCOL").In("tcp", []string{"tcp", "unix", "udp"}),
  72. sec.Key("ADDR").MustString(":7020"))
  73. case "smtp":
  74. LogConfigs[i] = fmt.Sprintf(`{"level":%s,"username":"%s","password":"%s","host":"%s","sendTos":["%s"],"subject":"%s"}`, level,
  75. sec.Key("USER").MustString("example@example.com"),
  76. sec.Key("PASSWD").MustString("******"),
  77. sec.Key("HOST").MustString("127.0.0.1:25"),
  78. strings.Replace(sec.Key("RECEIVERS").MustString("example@example.com"), ",", "\",\"", -1),
  79. sec.Key("SUBJECT").MustString("Diagnostic message from serve"))
  80. case "database":
  81. LogConfigs[i] = fmt.Sprintf(`{"level":%s,"driver":"%s","conn":"%s"}`, level,
  82. sec.Key("DRIVER").String(),
  83. sec.Key("CONN").String())
  84. }
  85. log.NewLogger(Cfg.Section("log").Key("BUFFER_LEN").MustInt64(10000), mode, LogConfigs[i])
  86. log.Info("Log Mode: %s(%s)", strings.Title(mode), levelName)
  87. }
  88. }
  89. // NewXORMLogService initializes xorm logger service
  90. func NewXORMLogService(disableConsole bool) {
  91. logModes := strings.Split(Cfg.Section("log").Key("MODE").MustString("console"), ",")
  92. var logConfigs string
  93. for _, mode := range logModes {
  94. mode = strings.TrimSpace(mode)
  95. if disableConsole && mode == "console" {
  96. continue
  97. }
  98. sec, err := Cfg.GetSection("log." + mode)
  99. if err != nil {
  100. sec, _ = Cfg.NewSection("log." + mode)
  101. }
  102. // Log level.
  103. levelName := getLogLevel("log."+mode, "LEVEL", LogLevel)
  104. level, ok := logLevels[levelName]
  105. if !ok {
  106. log.Fatal(4, "Unknown log level: %s", levelName)
  107. }
  108. // Generate log configuration.
  109. switch mode {
  110. case "console":
  111. logConfigs = fmt.Sprintf(`{"level":%s}`, level)
  112. case "file":
  113. logPath := sec.Key("FILE_NAME").MustString(path.Join(LogRootPath, "xorm.log"))
  114. if err = os.MkdirAll(path.Dir(logPath), os.ModePerm); err != nil {
  115. panic(err.Error())
  116. }
  117. logPath = path.Join(filepath.Dir(logPath), "xorm.log")
  118. logConfigs = fmt.Sprintf(
  119. `{"level":%s,"filename":"%s","rotate":%v,"maxsize":%d,"daily":%v,"maxdays":%d}`, level,
  120. logPath,
  121. sec.Key("LOG_ROTATE").MustBool(true),
  122. 1<<uint(sec.Key("MAX_SIZE_SHIFT").MustInt(28)),
  123. sec.Key("DAILY_ROTATE").MustBool(true),
  124. sec.Key("MAX_DAYS").MustInt(7))
  125. case "conn":
  126. logConfigs = fmt.Sprintf(`{"level":%s,"reconnectOnMsg":%v,"reconnect":%v,"net":"%s","addr":"%s"}`, level,
  127. sec.Key("RECONNECT_ON_MSG").MustBool(),
  128. sec.Key("RECONNECT").MustBool(),
  129. sec.Key("PROTOCOL").In("tcp", []string{"tcp", "unix", "udp"}),
  130. sec.Key("ADDR").MustString(":7020"))
  131. case "smtp":
  132. logConfigs = fmt.Sprintf(`{"level":%s,"username":"%s","password":"%s","host":"%s","sendTos":"%s","subject":"%s"}`, level,
  133. sec.Key("USER").MustString("example@example.com"),
  134. sec.Key("PASSWD").MustString("******"),
  135. sec.Key("HOST").MustString("127.0.0.1:25"),
  136. sec.Key("RECEIVERS").MustString("[]"),
  137. sec.Key("SUBJECT").MustString("Diagnostic message from serve"))
  138. case "database":
  139. logConfigs = fmt.Sprintf(`{"level":%s,"driver":"%s","conn":"%s"}`, level,
  140. sec.Key("DRIVER").String(),
  141. sec.Key("CONN").String())
  142. }
  143. log.NewXORMLogger(Cfg.Section("log").Key("BUFFER_LEN").MustInt64(10000), mode, logConfigs)
  144. if !disableConsole {
  145. log.Info("XORM Log Mode: %s(%s)", strings.Title(mode), levelName)
  146. }
  147. var lvl core.LogLevel
  148. switch levelName {
  149. case "Trace", "Debug":
  150. lvl = core.LOG_DEBUG
  151. case "Info":
  152. lvl = core.LOG_INFO
  153. case "Warn":
  154. lvl = core.LOG_WARNING
  155. case "Error", "Critical":
  156. lvl = core.LOG_ERR
  157. }
  158. log.XORMLogger.SetLevel(lvl)
  159. }
  160. if len(logConfigs) == 0 {
  161. log.DiscardXORMLogger()
  162. }
  163. }