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.go 5.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  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. "os"
  7. "runtime"
  8. "strings"
  9. )
  10. var (
  11. // DEFAULT is the name of the default logger
  12. DEFAULT = "default"
  13. // NamedLoggers map of named loggers
  14. NamedLoggers = make(map[string]*Logger)
  15. prefix string
  16. )
  17. // NewLogger create a logger for the default logger
  18. func NewLogger(bufLen int64, name, provider, config string) *Logger {
  19. err := NewNamedLogger(DEFAULT, bufLen, name, provider, config)
  20. if err != nil {
  21. CriticalWithSkip(1, "Unable to create default logger: %v", err)
  22. panic(err)
  23. }
  24. return NamedLoggers[DEFAULT]
  25. }
  26. // NewNamedLogger creates a new named logger for a given configuration
  27. func NewNamedLogger(name string, bufLen int64, subname, provider, config string) error {
  28. logger, ok := NamedLoggers[name]
  29. if !ok {
  30. logger = newLogger(name, bufLen)
  31. NamedLoggers[name] = logger
  32. }
  33. return logger.SetLogger(subname, provider, config)
  34. }
  35. // DelNamedLogger closes and deletes the named logger
  36. func DelNamedLogger(name string) {
  37. l, ok := NamedLoggers[name]
  38. if ok {
  39. delete(NamedLoggers, name)
  40. l.Close()
  41. }
  42. }
  43. // DelLogger removes the named sublogger from the default logger
  44. func DelLogger(name string) error {
  45. logger := NamedLoggers[DEFAULT]
  46. found, err := logger.DelLogger(name)
  47. if !found {
  48. Trace("Log %s not found, no need to delete", name)
  49. }
  50. return err
  51. }
  52. // GetLogger returns either a named logger or the default logger
  53. func GetLogger(name string) *Logger {
  54. logger, ok := NamedLoggers[name]
  55. if ok {
  56. return logger
  57. }
  58. return NamedLoggers[DEFAULT]
  59. }
  60. // GetLevel returns the minimum logger level
  61. func GetLevel() Level {
  62. return NamedLoggers[DEFAULT].GetLevel()
  63. }
  64. // GetStacktraceLevel returns the minimum logger level
  65. func GetStacktraceLevel() Level {
  66. return NamedLoggers[DEFAULT].GetStacktraceLevel()
  67. }
  68. // Trace records trace log
  69. func Trace(format string, v ...interface{}) {
  70. Log(1, TRACE, format, v...)
  71. }
  72. // IsTrace returns true if at least one logger is TRACE
  73. func IsTrace() bool {
  74. return GetLevel() <= TRACE
  75. }
  76. // Debug records debug log
  77. func Debug(format string, v ...interface{}) {
  78. Log(1, DEBUG, format, v...)
  79. }
  80. // IsDebug returns true if at least one logger is DEBUG
  81. func IsDebug() bool {
  82. return GetLevel() <= DEBUG
  83. }
  84. // Info records info log
  85. func Info(format string, v ...interface{}) {
  86. Log(1, INFO, format, v...)
  87. }
  88. // IsInfo returns true if at least one logger is INFO
  89. func IsInfo() bool {
  90. return GetLevel() <= INFO
  91. }
  92. // Warn records warning log
  93. func Warn(format string, v ...interface{}) {
  94. Log(1, WARN, format, v...)
  95. }
  96. // IsWarn returns true if at least one logger is WARN
  97. func IsWarn() bool {
  98. return GetLevel() <= WARN
  99. }
  100. // Error records error log
  101. func Error(format string, v ...interface{}) {
  102. Log(1, ERROR, format, v...)
  103. }
  104. // ErrorWithSkip records error log from "skip" calls back from this function
  105. func ErrorWithSkip(skip int, format string, v ...interface{}) {
  106. Log(skip+1, ERROR, format, v...)
  107. }
  108. // IsError returns true if at least one logger is ERROR
  109. func IsError() bool {
  110. return GetLevel() <= ERROR
  111. }
  112. // Critical records critical log
  113. func Critical(format string, v ...interface{}) {
  114. Log(1, CRITICAL, format, v...)
  115. }
  116. // CriticalWithSkip records critical log from "skip" calls back from this function
  117. func CriticalWithSkip(skip int, format string, v ...interface{}) {
  118. Log(skip+1, CRITICAL, format, v...)
  119. }
  120. // IsCritical returns true if at least one logger is CRITICAL
  121. func IsCritical() bool {
  122. return GetLevel() <= CRITICAL
  123. }
  124. // Fatal records fatal log and exit process
  125. func Fatal(format string, v ...interface{}) {
  126. Log(1, FATAL, format, v...)
  127. Close()
  128. os.Exit(1)
  129. }
  130. // FatalWithSkip records fatal log from "skip" calls back from this function
  131. func FatalWithSkip(skip int, format string, v ...interface{}) {
  132. Log(skip+1, FATAL, format, v...)
  133. Close()
  134. os.Exit(1)
  135. }
  136. // IsFatal returns true if at least one logger is FATAL
  137. func IsFatal() bool {
  138. return GetLevel() <= FATAL
  139. }
  140. // Close closes all the loggers
  141. func Close() {
  142. l, ok := NamedLoggers[DEFAULT]
  143. if !ok {
  144. return
  145. }
  146. delete(NamedLoggers, DEFAULT)
  147. l.Close()
  148. }
  149. // Log a message with defined skip and at logging level
  150. // A skip of 0 refers to the caller of this command
  151. func Log(skip int, level Level, format string, v ...interface{}) {
  152. l, ok := NamedLoggers[DEFAULT]
  153. if ok {
  154. l.Log(skip+1, level, format, v...)
  155. }
  156. }
  157. // LoggerAsWriter is a io.Writer shim around the gitea log
  158. type LoggerAsWriter struct {
  159. ourLoggers []*Logger
  160. level Level
  161. }
  162. // NewLoggerAsWriter creates a Writer representation of the logger with setable log level
  163. func NewLoggerAsWriter(level string, ourLoggers ...*Logger) *LoggerAsWriter {
  164. if len(ourLoggers) == 0 {
  165. ourLoggers = []*Logger{NamedLoggers[DEFAULT]}
  166. }
  167. l := &LoggerAsWriter{
  168. ourLoggers: ourLoggers,
  169. level: FromString(level),
  170. }
  171. return l
  172. }
  173. // Write implements the io.Writer interface to allow spoofing of macaron
  174. func (l *LoggerAsWriter) Write(p []byte) (int, error) {
  175. for _, logger := range l.ourLoggers {
  176. // Skip = 3 because this presumes that we have been called by log.Println()
  177. // If the caller has used log.Output or the like this will be wrong
  178. logger.Log(3, l.level, string(p))
  179. }
  180. return len(p), nil
  181. }
  182. // Log takes a given string and logs it at the set log-level
  183. func (l *LoggerAsWriter) Log(msg string) {
  184. for _, logger := range l.ourLoggers {
  185. // Set the skip to reference the call just above this
  186. _ = logger.Log(1, l.level, msg)
  187. }
  188. }
  189. func init() {
  190. _, filename, _, _ := runtime.Caller(0)
  191. prefix = strings.TrimSuffix(filename, "modules/log/log.go")
  192. }