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_logging.go 8.0KB

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