Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

manager_logging.go 7.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. // Copyright 2022 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package cmd
  4. import (
  5. "fmt"
  6. "os"
  7. "code.gitea.io/gitea/modules/log"
  8. "code.gitea.io/gitea/modules/private"
  9. "github.com/urfave/cli"
  10. )
  11. var (
  12. defaultLoggingFlags = []cli.Flag{
  13. cli.StringFlag{
  14. Name: "logger",
  15. Usage: `Logger name - will default to "default"`,
  16. }, cli.StringFlag{
  17. Name: "writer",
  18. Usage: "Name of the log writer - will default to mode",
  19. }, cli.StringFlag{
  20. Name: "level",
  21. Usage: "Logging level for the new logger",
  22. }, cli.StringFlag{
  23. Name: "stacktrace-level, L",
  24. Usage: "Stacktrace logging level",
  25. }, cli.StringFlag{
  26. Name: "flags, F",
  27. Usage: "Flags for the logger",
  28. }, cli.StringFlag{
  29. Name: "expression, e",
  30. Usage: "Matching expression for the logger",
  31. }, cli.StringFlag{
  32. Name: "prefix, p",
  33. Usage: "Prefix for the logger",
  34. }, cli.BoolFlag{
  35. Name: "color",
  36. Usage: "Use color in the logs",
  37. }, cli.BoolFlag{
  38. Name: "debug",
  39. },
  40. }
  41. subcmdLogging = cli.Command{
  42. Name: "logging",
  43. Usage: "Adjust logging commands",
  44. Subcommands: []cli.Command{
  45. {
  46. Name: "pause",
  47. Usage: "Pause logging (Gitea will buffer logs up to a certain point and will drop them after that point)",
  48. Flags: []cli.Flag{
  49. cli.BoolFlag{
  50. Name: "debug",
  51. },
  52. },
  53. Action: runPauseLogging,
  54. }, {
  55. Name: "resume",
  56. Usage: "Resume logging",
  57. Flags: []cli.Flag{
  58. cli.BoolFlag{
  59. Name: "debug",
  60. },
  61. },
  62. Action: runResumeLogging,
  63. }, {
  64. Name: "release-and-reopen",
  65. Usage: "Cause Gitea to release and re-open files used for logging",
  66. Flags: []cli.Flag{
  67. cli.BoolFlag{
  68. Name: "debug",
  69. },
  70. },
  71. Action: runReleaseReopenLogging,
  72. }, {
  73. Name: "remove",
  74. Usage: "Remove a logger",
  75. ArgsUsage: "[name] Name of logger to remove",
  76. Flags: []cli.Flag{
  77. cli.BoolFlag{
  78. Name: "debug",
  79. }, cli.StringFlag{
  80. Name: "logger",
  81. Usage: `Logger name - will default to "default"`,
  82. },
  83. },
  84. Action: runRemoveLogger,
  85. }, {
  86. Name: "add",
  87. Usage: "Add a logger",
  88. Subcommands: []cli.Command{
  89. {
  90. Name: "file",
  91. Usage: "Add a file logger",
  92. Flags: append(defaultLoggingFlags, []cli.Flag{
  93. cli.StringFlag{
  94. Name: "filename, f",
  95. Usage: "Filename for the logger - this must be set.",
  96. }, cli.BoolTFlag{
  97. Name: "rotate, r",
  98. Usage: "Rotate logs",
  99. }, cli.Int64Flag{
  100. Name: "max-size, s",
  101. Usage: "Maximum size in bytes before rotation",
  102. }, cli.BoolTFlag{
  103. Name: "daily, d",
  104. Usage: "Rotate logs daily",
  105. }, cli.IntFlag{
  106. Name: "max-days, D",
  107. Usage: "Maximum number of daily logs to keep",
  108. }, cli.BoolTFlag{
  109. Name: "compress, z",
  110. Usage: "Compress rotated logs",
  111. }, cli.IntFlag{
  112. Name: "compression-level, Z",
  113. Usage: "Compression level to use",
  114. },
  115. }...),
  116. Action: runAddFileLogger,
  117. }, {
  118. Name: "conn",
  119. Usage: "Add a net conn logger",
  120. Flags: append(defaultLoggingFlags, []cli.Flag{
  121. cli.BoolFlag{
  122. Name: "reconnect-on-message, R",
  123. Usage: "Reconnect to host for every message",
  124. }, cli.BoolFlag{
  125. Name: "reconnect, r",
  126. Usage: "Reconnect to host when connection is dropped",
  127. }, cli.StringFlag{
  128. Name: "protocol, P",
  129. Usage: "Set protocol to use: tcp, unix, or udp (defaults to tcp)",
  130. }, cli.StringFlag{
  131. Name: "address, a",
  132. Usage: "Host address and port to connect to (defaults to :7020)",
  133. },
  134. }...),
  135. Action: runAddConnLogger,
  136. },
  137. },
  138. }, {
  139. Name: "log-sql",
  140. Usage: "Set LogSQL",
  141. Flags: []cli.Flag{
  142. cli.BoolFlag{
  143. Name: "debug",
  144. }, cli.BoolFlag{
  145. Name: "off",
  146. Usage: "Switch off SQL logging",
  147. },
  148. },
  149. Action: runSetLogSQL,
  150. },
  151. },
  152. }
  153. )
  154. func runRemoveLogger(c *cli.Context) error {
  155. ctx, cancel := installSignals()
  156. defer cancel()
  157. setup(ctx, c.Bool("debug"))
  158. logger := c.String("logger")
  159. if len(logger) == 0 {
  160. logger = log.DEFAULT
  161. }
  162. writer := c.Args().First()
  163. extra := private.RemoveLogger(ctx, logger, writer)
  164. return handleCliResponseExtra(extra)
  165. }
  166. func runAddConnLogger(c *cli.Context) error {
  167. ctx, cancel := installSignals()
  168. defer cancel()
  169. setup(ctx, c.Bool("debug"))
  170. vals := map[string]any{}
  171. mode := "conn"
  172. vals["net"] = "tcp"
  173. if c.IsSet("protocol") {
  174. switch c.String("protocol") {
  175. case "udp":
  176. vals["net"] = "udp"
  177. case "unix":
  178. vals["net"] = "unix"
  179. }
  180. }
  181. if c.IsSet("address") {
  182. vals["address"] = c.String("address")
  183. } else {
  184. vals["address"] = ":7020"
  185. }
  186. if c.IsSet("reconnect") {
  187. vals["reconnect"] = c.Bool("reconnect")
  188. }
  189. if c.IsSet("reconnect-on-message") {
  190. vals["reconnectOnMsg"] = c.Bool("reconnect-on-message")
  191. }
  192. return commonAddLogger(c, mode, vals)
  193. }
  194. func runAddFileLogger(c *cli.Context) error {
  195. ctx, cancel := installSignals()
  196. defer cancel()
  197. setup(ctx, c.Bool("debug"))
  198. vals := map[string]any{}
  199. mode := "file"
  200. if c.IsSet("filename") {
  201. vals["filename"] = c.String("filename")
  202. } else {
  203. return fmt.Errorf("filename must be set when creating a file logger")
  204. }
  205. if c.IsSet("rotate") {
  206. vals["rotate"] = c.Bool("rotate")
  207. }
  208. if c.IsSet("max-size") {
  209. vals["maxsize"] = c.Int64("max-size")
  210. }
  211. if c.IsSet("daily") {
  212. vals["daily"] = c.Bool("daily")
  213. }
  214. if c.IsSet("max-days") {
  215. vals["maxdays"] = c.Int("max-days")
  216. }
  217. if c.IsSet("compress") {
  218. vals["compress"] = c.Bool("compress")
  219. }
  220. if c.IsSet("compression-level") {
  221. vals["compressionLevel"] = c.Int("compression-level")
  222. }
  223. return commonAddLogger(c, mode, vals)
  224. }
  225. func commonAddLogger(c *cli.Context, mode string, vals map[string]any) error {
  226. if len(c.String("level")) > 0 {
  227. vals["level"] = log.LevelFromString(c.String("level")).String()
  228. }
  229. if len(c.String("stacktrace-level")) > 0 {
  230. vals["stacktraceLevel"] = log.LevelFromString(c.String("stacktrace-level")).String()
  231. }
  232. if len(c.String("expression")) > 0 {
  233. vals["expression"] = c.String("expression")
  234. }
  235. if len(c.String("prefix")) > 0 {
  236. vals["prefix"] = c.String("prefix")
  237. }
  238. if len(c.String("flags")) > 0 {
  239. vals["flags"] = log.FlagsFromString(c.String("flags"))
  240. }
  241. if c.IsSet("color") {
  242. vals["colorize"] = c.Bool("color")
  243. }
  244. logger := log.DEFAULT
  245. if c.IsSet("logger") {
  246. logger = c.String("logger")
  247. }
  248. writer := mode
  249. if c.IsSet("writer") {
  250. writer = c.String("writer")
  251. }
  252. ctx, cancel := installSignals()
  253. defer cancel()
  254. extra := private.AddLogger(ctx, logger, writer, mode, vals)
  255. return handleCliResponseExtra(extra)
  256. }
  257. func runPauseLogging(c *cli.Context) error {
  258. ctx, cancel := installSignals()
  259. defer cancel()
  260. setup(ctx, c.Bool("debug"))
  261. userMsg := private.PauseLogging(ctx)
  262. _, _ = fmt.Fprintln(os.Stdout, userMsg)
  263. return nil
  264. }
  265. func runResumeLogging(c *cli.Context) error {
  266. ctx, cancel := installSignals()
  267. defer cancel()
  268. setup(ctx, c.Bool("debug"))
  269. userMsg := private.ResumeLogging(ctx)
  270. _, _ = fmt.Fprintln(os.Stdout, userMsg)
  271. return nil
  272. }
  273. func runReleaseReopenLogging(c *cli.Context) error {
  274. ctx, cancel := installSignals()
  275. defer cancel()
  276. setup(ctx, c.Bool("debug"))
  277. userMsg := private.ReleaseReopenLogging(ctx)
  278. _, _ = fmt.Fprintln(os.Stdout, userMsg)
  279. return nil
  280. }
  281. func runSetLogSQL(c *cli.Context) error {
  282. ctx, cancel := installSignals()
  283. defer cancel()
  284. setup(ctx, c.Bool("debug"))
  285. extra := private.SetLogSQL(ctx, !c.Bool("off"))
  286. return handleCliResponseExtra(extra)
  287. }