log.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. // Copyright 2014 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 log
  5. import (
  6. "fmt"
  7. "os"
  8. "path/filepath"
  9. "strings"
  10. "gopkg.in/ini.v1"
  11. "github.com/inconshreveable/log15"
  12. "github.com/inconshreveable/log15/term"
  13. )
  14. var Root log15.Logger
  15. var loggersToClose []DisposableHandler
  16. func init() {
  17. loggersToClose = make([]DisposableHandler, 0)
  18. Root = log15.Root()
  19. }
  20. func New(logger string, ctx ...interface{}) Logger {
  21. params := append([]interface{}{"logger", logger}, ctx...)
  22. return Root.New(params...)
  23. }
  24. func Trace(format string, v ...interface{}) {
  25. Root.Debug(fmt.Sprintf(format, v))
  26. }
  27. func Debug(format string, v ...interface{}) {
  28. Root.Debug(fmt.Sprintf(format, v))
  29. }
  30. func Debug2(message string, v ...interface{}) {
  31. Root.Debug(message, v...)
  32. }
  33. func Info(format string, v ...interface{}) {
  34. Root.Info(fmt.Sprintf(format, v))
  35. }
  36. func Info2(message string, v ...interface{}) {
  37. Root.Info(message, v...)
  38. }
  39. func Warn(format string, v ...interface{}) {
  40. Root.Warn(fmt.Sprintf(format, v))
  41. }
  42. func Warn2(message string, v ...interface{}) {
  43. Root.Warn(message, v...)
  44. }
  45. func Error(skip int, format string, v ...interface{}) {
  46. Root.Error(fmt.Sprintf(format, v))
  47. }
  48. func Error2(message string, v ...interface{}) {
  49. Root.Error(message, v...)
  50. }
  51. func Critical(skip int, format string, v ...interface{}) {
  52. Root.Crit(fmt.Sprintf(format, v))
  53. }
  54. func Fatal(skip int, format string, v ...interface{}) {
  55. Root.Crit(fmt.Sprintf(format, v))
  56. Close()
  57. os.Exit(1)
  58. }
  59. func Close() {
  60. for _, logger := range loggersToClose {
  61. logger.Close()
  62. }
  63. loggersToClose = make([]DisposableHandler, 0)
  64. }
  65. var logLevels = map[string]log15.Lvl{
  66. "trace": log15.LvlDebug,
  67. "debug": log15.LvlDebug,
  68. "info": log15.LvlInfo,
  69. "warn": log15.LvlWarn,
  70. "error": log15.LvlError,
  71. "critical": log15.LvlCrit,
  72. }
  73. func getLogLevelFromConfig(key string, defaultName string, cfg *ini.File) (string, log15.Lvl) {
  74. levelName := cfg.Section(key).Key("level").MustString("info")
  75. levelName = strings.ToLower(levelName)
  76. level := getLogLevelFromString(levelName)
  77. return levelName, level
  78. }
  79. func getLogLevelFromString(levelName string) log15.Lvl {
  80. level, ok := logLevels[levelName]
  81. if !ok {
  82. Root.Error("Unknown log level", "level", levelName)
  83. return log15.LvlError
  84. }
  85. return level
  86. }
  87. func getFilters(filterStrArray []string) map[string]log15.Lvl {
  88. filterMap := make(map[string]log15.Lvl)
  89. for _, filterStr := range filterStrArray {
  90. parts := strings.Split(filterStr, ":")
  91. filterMap[parts[0]] = getLogLevelFromString(parts[1])
  92. }
  93. return filterMap
  94. }
  95. func getLogFormat(format string) log15.Format {
  96. switch format {
  97. case "console":
  98. if term.IsTty(os.Stdout.Fd()) {
  99. return log15.TerminalFormat()
  100. }
  101. return log15.LogfmtFormat()
  102. case "text":
  103. return log15.LogfmtFormat()
  104. case "json":
  105. return log15.JsonFormat()
  106. default:
  107. return log15.LogfmtFormat()
  108. }
  109. }
  110. func ReadLoggingConfig(modes []string, logsPath string, cfg *ini.File) {
  111. Close()
  112. defaultLevelName, _ := getLogLevelFromConfig("log", "info", cfg)
  113. defaultFilters := getFilters(cfg.Section("log").Key("filters").Strings(" "))
  114. handlers := make([]log15.Handler, 0)
  115. for _, mode := range modes {
  116. mode = strings.TrimSpace(mode)
  117. sec, err := cfg.GetSection("log." + mode)
  118. if err != nil {
  119. Root.Error("Unknown log mode", "mode", mode)
  120. }
  121. // Log level.
  122. _, level := getLogLevelFromConfig("log."+mode, defaultLevelName, cfg)
  123. modeFilters := getFilters(sec.Key("filters").Strings(" "))
  124. format := getLogFormat(sec.Key("format").MustString(""))
  125. var handler log15.Handler
  126. // Generate log configuration.
  127. switch mode {
  128. case "console":
  129. handler = log15.StreamHandler(os.Stdout, format)
  130. case "file":
  131. fileName := sec.Key("file_name").MustString(filepath.Join(logsPath, "grafana.log"))
  132. os.MkdirAll(filepath.Dir(fileName), os.ModePerm)
  133. fileHandler := NewFileWriter()
  134. fileHandler.Filename = fileName
  135. fileHandler.Format = format
  136. fileHandler.Rotate = sec.Key("log_rotate").MustBool(true)
  137. fileHandler.Maxlines = sec.Key("max_lines").MustInt(1000000)
  138. fileHandler.Maxsize = 1 << uint(sec.Key("max_size_shift").MustInt(28))
  139. fileHandler.Daily = sec.Key("daily_rotate").MustBool(true)
  140. fileHandler.Maxdays = sec.Key("max_days").MustInt64(7)
  141. fileHandler.Init()
  142. loggersToClose = append(loggersToClose, fileHandler)
  143. handler = fileHandler
  144. case "syslog":
  145. sysLogHandler := NewSyslog()
  146. sysLogHandler.Format = format
  147. sysLogHandler.Network = sec.Key("network").MustString("")
  148. sysLogHandler.Address = sec.Key("address").MustString("")
  149. sysLogHandler.Facility = sec.Key("facility").MustString("local7")
  150. sysLogHandler.Tag = sec.Key("tag").MustString("")
  151. if err := sysLogHandler.Init(); err != nil {
  152. Root.Error("Failed to init syslog log handler", "error", err)
  153. os.Exit(1)
  154. }
  155. loggersToClose = append(loggersToClose, sysLogHandler)
  156. handler = sysLogHandler
  157. }
  158. for key, value := range defaultFilters {
  159. if _, exist := modeFilters[key]; !exist {
  160. modeFilters[key] = value
  161. }
  162. }
  163. handler = LogFilterHandler(level, modeFilters, handler)
  164. handlers = append(handlers, handler)
  165. }
  166. Root.SetHandler(log15.MultiHandler(handlers...))
  167. }
  168. func LogFilterHandler(maxLevel log15.Lvl, filters map[string]log15.Lvl, h log15.Handler) log15.Handler {
  169. return log15.FilterHandler(func(r *log15.Record) (pass bool) {
  170. if len(filters) > 0 {
  171. for i := 0; i < len(r.Ctx); i += 2 {
  172. key := r.Ctx[i].(string)
  173. if key == "logger" {
  174. loggerName, strOk := r.Ctx[i+1].(string)
  175. if strOk {
  176. if filterLevel, ok := filters[loggerName]; ok {
  177. return r.Lvl <= filterLevel
  178. }
  179. }
  180. }
  181. }
  182. }
  183. return r.Lvl <= maxLevel
  184. }, h)
  185. }