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.

manager.go 5.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. // Copyright 2020 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package private
  4. import (
  5. "fmt"
  6. "net/http"
  7. "code.gitea.io/gitea/models/db"
  8. "code.gitea.io/gitea/modules/context"
  9. "code.gitea.io/gitea/modules/graceful"
  10. "code.gitea.io/gitea/modules/graceful/releasereopen"
  11. "code.gitea.io/gitea/modules/log"
  12. "code.gitea.io/gitea/modules/private"
  13. "code.gitea.io/gitea/modules/queue"
  14. "code.gitea.io/gitea/modules/setting"
  15. "code.gitea.io/gitea/modules/templates"
  16. "code.gitea.io/gitea/modules/web"
  17. )
  18. // ReloadTemplates reloads all the templates
  19. func ReloadTemplates(ctx *context.PrivateContext) {
  20. err := templates.ReloadHTMLTemplates()
  21. if err != nil {
  22. ctx.JSON(http.StatusInternalServerError, private.Response{
  23. UserMsg: fmt.Sprintf("Template error: %v", err),
  24. })
  25. return
  26. }
  27. ctx.PlainText(http.StatusOK, "success")
  28. }
  29. // FlushQueues flushes all the Queues
  30. func FlushQueues(ctx *context.PrivateContext) {
  31. opts := web.GetForm(ctx).(*private.FlushOptions)
  32. if opts.NonBlocking {
  33. // Save the hammer ctx here - as a new one is created each time you call this.
  34. baseCtx := graceful.GetManager().HammerContext()
  35. go func() {
  36. err := queue.GetManager().FlushAll(baseCtx, opts.Timeout)
  37. if err != nil {
  38. log.Error("Flushing request timed-out with error: %v", err)
  39. }
  40. }()
  41. ctx.JSON(http.StatusAccepted, private.Response{
  42. UserMsg: "Flushing",
  43. })
  44. return
  45. }
  46. err := queue.GetManager().FlushAll(ctx, opts.Timeout)
  47. if err != nil {
  48. ctx.JSON(http.StatusRequestTimeout, private.Response{
  49. UserMsg: fmt.Sprintf("%v", err),
  50. })
  51. }
  52. ctx.PlainText(http.StatusOK, "success")
  53. }
  54. // PauseLogging pauses logging
  55. func PauseLogging(ctx *context.PrivateContext) {
  56. log.GetManager().PauseAll()
  57. ctx.PlainText(http.StatusOK, "success")
  58. }
  59. // ResumeLogging resumes logging
  60. func ResumeLogging(ctx *context.PrivateContext) {
  61. log.GetManager().ResumeAll()
  62. ctx.PlainText(http.StatusOK, "success")
  63. }
  64. // ReleaseReopenLogging releases and reopens logging files
  65. func ReleaseReopenLogging(ctx *context.PrivateContext) {
  66. if err := releasereopen.GetManager().ReleaseReopen(); err != nil {
  67. ctx.JSON(http.StatusInternalServerError, private.Response{
  68. Err: fmt.Sprintf("Error during release and reopen: %v", err),
  69. })
  70. return
  71. }
  72. ctx.PlainText(http.StatusOK, "success")
  73. }
  74. // SetLogSQL re-sets database SQL logging
  75. func SetLogSQL(ctx *context.PrivateContext) {
  76. db.SetLogSQL(ctx, ctx.FormBool("on"))
  77. ctx.PlainText(http.StatusOK, "success")
  78. }
  79. // RemoveLogger removes a logger
  80. func RemoveLogger(ctx *context.PrivateContext) {
  81. logger := ctx.Params("logger")
  82. writer := ctx.Params("writer")
  83. err := log.GetManager().GetLogger(logger).RemoveWriter(writer)
  84. if err != nil {
  85. ctx.JSON(http.StatusInternalServerError, private.Response{
  86. Err: fmt.Sprintf("Failed to remove log writer: %s %s %v", logger, writer, err),
  87. })
  88. return
  89. }
  90. ctx.PlainText(http.StatusOK, fmt.Sprintf("Removed %s %s", logger, writer))
  91. }
  92. // AddLogger adds a logger
  93. func AddLogger(ctx *context.PrivateContext) {
  94. opts := web.GetForm(ctx).(*private.LoggerOptions)
  95. if len(opts.Logger) == 0 {
  96. opts.Logger = log.DEFAULT
  97. }
  98. writerMode := log.WriterMode{}
  99. writerType := opts.Mode
  100. var flags string
  101. var ok bool
  102. if flags, ok = opts.Config["flags"].(string); !ok {
  103. switch opts.Logger {
  104. case "access":
  105. flags = ""
  106. case "router":
  107. flags = "date,time"
  108. default:
  109. flags = "stdflags"
  110. }
  111. }
  112. writerMode.Flags = log.FlagsFromString(flags)
  113. if writerMode.Colorize, ok = opts.Config["colorize"].(bool); !ok && opts.Mode == "console" {
  114. if _, ok := opts.Config["stderr"]; ok {
  115. writerMode.Colorize = log.CanColorStderr
  116. } else {
  117. writerMode.Colorize = log.CanColorStdout
  118. }
  119. }
  120. writerMode.Level = setting.Log.Level
  121. if level, ok := opts.Config["level"].(string); ok {
  122. writerMode.Level = log.LevelFromString(level)
  123. }
  124. writerMode.StacktraceLevel = setting.Log.StacktraceLogLevel
  125. if stacktraceLevel, ok := opts.Config["level"].(string); ok {
  126. writerMode.StacktraceLevel = log.LevelFromString(stacktraceLevel)
  127. }
  128. writerMode.Prefix, _ = opts.Config["prefix"].(string)
  129. writerMode.Expression, _ = opts.Config["expression"].(string)
  130. switch writerType {
  131. case "console":
  132. writerOption := log.WriterConsoleOption{}
  133. writerOption.Stderr, _ = opts.Config["stderr"].(bool)
  134. writerMode.WriterOption = writerOption
  135. case "file":
  136. writerOption := log.WriterFileOption{}
  137. fileName, _ := opts.Config["filename"].(string)
  138. writerOption.FileName = setting.LogPrepareFilenameForWriter(fileName, opts.Writer+".log")
  139. writerOption.LogRotate, _ = opts.Config["rotate"].(bool)
  140. maxSizeShift, _ := opts.Config["maxsize"].(int)
  141. if maxSizeShift == 0 {
  142. maxSizeShift = 28
  143. }
  144. writerOption.MaxSize = 1 << maxSizeShift
  145. writerOption.DailyRotate, _ = opts.Config["daily"].(bool)
  146. writerOption.MaxDays, _ = opts.Config["maxdays"].(int)
  147. if writerOption.MaxDays == 0 {
  148. writerOption.MaxDays = 7
  149. }
  150. writerOption.Compress, _ = opts.Config["compress"].(bool)
  151. writerOption.CompressionLevel, _ = opts.Config["compressionLevel"].(int)
  152. if writerOption.CompressionLevel == 0 {
  153. writerOption.CompressionLevel = -1
  154. }
  155. writerMode.WriterOption = writerOption
  156. case "conn":
  157. writerOption := log.WriterConnOption{}
  158. writerOption.ReconnectOnMsg, _ = opts.Config["reconnectOnMsg"].(bool)
  159. writerOption.Reconnect, _ = opts.Config["reconnect"].(bool)
  160. writerOption.Protocol, _ = opts.Config["net"].(string)
  161. writerOption.Addr, _ = opts.Config["address"].(string)
  162. writerMode.WriterOption = writerOption
  163. default:
  164. panic(fmt.Sprintf("invalid log writer mode: %s", writerType))
  165. }
  166. writer, err := log.NewEventWriter(opts.Writer, writerType, writerMode)
  167. if err != nil {
  168. log.Error("Failed to create new log writer: %v", err)
  169. ctx.JSON(http.StatusInternalServerError, private.Response{
  170. Err: fmt.Sprintf("Failed to create new log writer: %v", err),
  171. })
  172. return
  173. }
  174. log.GetManager().GetLogger(opts.Logger).AddWriters(writer)
  175. ctx.PlainText(http.StatusOK, "success")
  176. }