summaryrefslogtreecommitdiffstats
path: root/cmd
diff options
context:
space:
mode:
authorzeripath <art27@cantab.net>2020-07-06 01:07:07 +0100
committerGitHub <noreply@github.com>2020-07-05 20:07:07 -0400
commitc5b08f6d5a73e6ba84da84e804d05a8dd3d651be (patch)
tree7e0f72b9c62b8764d000614714c91a01ebbee223 /cmd
parent38fb087d1983ca8320fb1a8c90150ae7956b358d (diff)
downloadgitea-c5b08f6d5a73e6ba84da84e804d05a8dd3d651be.tar.gz
gitea-c5b08f6d5a73e6ba84da84e804d05a8dd3d651be.zip
Pause, Resume, Release&Reopen, Add and Remove Logging from command line (#11777)
* Make LogDescriptions race safe * Add manager commands for pausing, resuming, adding and removing loggers Signed-off-by: Andrew Thornton <art27@cantab.net> * Placate lint * Ensure that file logger is run! * Add support for smtp and conn Signed-off-by: Andrew Thornton <art27@cantab.net> * Add release-and-reopen Signed-off-by: Andrew Thornton <art27@cantab.net> Co-authored-by: techknowlogick <techknowlogick@gitea.io> Co-authored-by: Lauris BH <lauris@nix.lv>
Diffstat (limited to 'cmd')
-rw-r--r--cmd/manager.go380
1 files changed, 371 insertions, 9 deletions
diff --git a/cmd/manager.go b/cmd/manager.go
index eed0a9e823..20c7858682 100644
--- a/cmd/manager.go
+++ b/cmd/manager.go
@@ -10,6 +10,7 @@ import (
"os"
"time"
+ "code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/private"
"github.com/urfave/cli"
@@ -25,16 +26,27 @@ var (
subcmdShutdown,
subcmdRestart,
subcmdFlushQueues,
+ subcmdLogging,
},
}
subcmdShutdown = cli.Command{
- Name: "shutdown",
- Usage: "Gracefully shutdown the running process",
+ Name: "shutdown",
+ Usage: "Gracefully shutdown the running process",
+ Flags: []cli.Flag{
+ cli.BoolFlag{
+ Name: "debug",
+ },
+ },
Action: runShutdown,
}
subcmdRestart = cli.Command{
- Name: "restart",
- Usage: "Gracefully restart the running process - (not implemented for windows servers)",
+ Name: "restart",
+ Usage: "Gracefully restart the running process - (not implemented for windows servers)",
+ Flags: []cli.Flag{
+ cli.BoolFlag{
+ Name: "debug",
+ },
+ },
Action: runRestart,
}
subcmdFlushQueues = cli.Command{
@@ -46,17 +58,331 @@ var (
Name: "timeout",
Value: 60 * time.Second,
Usage: "Timeout for the flushing process",
- },
- cli.BoolFlag{
+ }, cli.BoolFlag{
Name: "non-blocking",
Usage: "Set to true to not wait for flush to complete before returning",
},
+ cli.BoolFlag{
+ Name: "debug",
+ },
+ },
+ }
+ defaultLoggingFlags = []cli.Flag{
+ cli.StringFlag{
+ Name: "group, g",
+ Usage: "Group to add logger to - will default to \"default\"",
+ }, cli.StringFlag{
+ Name: "name, n",
+ Usage: "Name of the new logger - will default to mode",
+ }, cli.StringFlag{
+ Name: "level, l",
+ Usage: "Logging level for the new logger",
+ }, cli.StringFlag{
+ Name: "stacktrace-level, L",
+ Usage: "Stacktrace logging level",
+ }, cli.StringFlag{
+ Name: "flags, F",
+ Usage: "Flags for the logger",
+ }, cli.StringFlag{
+ Name: "expression, e",
+ Usage: "Matching expression for the logger",
+ }, cli.StringFlag{
+ Name: "prefix, p",
+ Usage: "Prefix for the logger",
+ }, cli.BoolFlag{
+ Name: "color",
+ Usage: "Use color in the logs",
+ }, cli.BoolFlag{
+ Name: "debug",
+ },
+ }
+ subcmdLogging = cli.Command{
+ Name: "logging",
+ Usage: "Adjust logging commands",
+ Subcommands: []cli.Command{
+ {
+ Name: "pause",
+ Usage: "Pause logging (Gitea will buffer logs up to a certain point and will drop them after that point)",
+ Flags: []cli.Flag{
+ cli.BoolFlag{
+ Name: "debug",
+ },
+ },
+ Action: runPauseLogging,
+ }, {
+ Name: "resume",
+ Usage: "Resume logging",
+ Flags: []cli.Flag{
+ cli.BoolFlag{
+ Name: "debug",
+ },
+ },
+ Action: runResumeLogging,
+ }, {
+ Name: "release-and-reopen",
+ Usage: "Cause Gitea to release and re-open files used for logging",
+ Flags: []cli.Flag{
+ cli.BoolFlag{
+ Name: "debug",
+ },
+ },
+ Action: runReleaseReopenLogging,
+ }, {
+ Name: "remove",
+ Usage: "Remove a logger",
+ ArgsUsage: "[name] Name of logger to remove",
+ Flags: []cli.Flag{
+ cli.BoolFlag{
+ Name: "debug",
+ }, cli.StringFlag{
+ Name: "group, g",
+ Usage: "Group to add logger to - will default to \"default\"",
+ },
+ },
+ Action: runRemoveLogger,
+ }, {
+ Name: "add",
+ Usage: "Add a logger",
+ Subcommands: []cli.Command{
+ {
+ Name: "console",
+ Usage: "Add a console logger",
+ Flags: append(defaultLoggingFlags,
+ cli.BoolFlag{
+ Name: "stderr",
+ Usage: "Output console logs to stderr - only relevant for console",
+ }),
+ Action: runAddConsoleLogger,
+ }, {
+ Name: "file",
+ Usage: "Add a file logger",
+ Flags: append(defaultLoggingFlags, []cli.Flag{
+ cli.StringFlag{
+ Name: "filename, f",
+ Usage: "Filename for the logger - this must be set.",
+ }, cli.BoolTFlag{
+ Name: "rotate, r",
+ Usage: "Rotate logs",
+ }, cli.Int64Flag{
+ Name: "max-size, s",
+ Usage: "Maximum size in bytes before rotation",
+ }, cli.BoolTFlag{
+ Name: "daily, d",
+ Usage: "Rotate logs daily",
+ }, cli.IntFlag{
+ Name: "max-days, D",
+ Usage: "Maximum number of daily logs to keep",
+ }, cli.BoolTFlag{
+ Name: "compress, z",
+ Usage: "Compress rotated logs",
+ }, cli.IntFlag{
+ Name: "compression-level, Z",
+ Usage: "Compression level to use",
+ },
+ }...),
+ Action: runAddFileLogger,
+ }, {
+ Name: "conn",
+ Usage: "Add a net conn logger",
+ Flags: append(defaultLoggingFlags, []cli.Flag{
+ cli.BoolFlag{
+ Name: "reconnect-on-message, R",
+ Usage: "Reconnect to host for every message",
+ }, cli.BoolFlag{
+ Name: "reconnect, r",
+ Usage: "Reconnect to host when connection is dropped",
+ }, cli.StringFlag{
+ Name: "protocol, P",
+ Usage: "Set protocol to use: tcp, unix, or udp (defaults to tcp)",
+ }, cli.StringFlag{
+ Name: "address, a",
+ Usage: "Host address and port to connect to (defaults to :7020)",
+ },
+ }...),
+ Action: runAddConnLogger,
+ }, {
+ Name: "smtp",
+ Usage: "Add an SMTP logger",
+ Flags: append(defaultLoggingFlags, []cli.Flag{
+ cli.StringFlag{
+ Name: "username, u",
+ Usage: "Mail server username",
+ }, cli.StringFlag{
+ Name: "password, P",
+ Usage: "Mail server password",
+ }, cli.StringFlag{
+ Name: "host, H",
+ Usage: "Mail server host (defaults to: 127.0.0.1:25)",
+ }, cli.StringSliceFlag{
+ Name: "send-to, s",
+ Usage: "Email address(es) to send to",
+ }, cli.StringFlag{
+ Name: "subject, S",
+ Usage: "Subject header of sent emails",
+ },
+ }...),
+ Action: runAddSMTPLogger,
+ },
+ },
+ },
},
}
)
+func runRemoveLogger(c *cli.Context) error {
+ setup("manager", c.Bool("debug"))
+ group := c.String("group")
+ if len(group) == 0 {
+ group = log.DEFAULT
+ }
+ name := c.Args().First()
+ statusCode, msg := private.RemoveLogger(group, name)
+ switch statusCode {
+ case http.StatusInternalServerError:
+ fail("InternalServerError", msg)
+ }
+
+ fmt.Fprintln(os.Stdout, msg)
+ return nil
+}
+
+func runAddSMTPLogger(c *cli.Context) error {
+ setup("manager", c.Bool("debug"))
+ vals := map[string]interface{}{}
+ mode := "smtp"
+ if c.IsSet("host") {
+ vals["host"] = c.String("host")
+ } else {
+ vals["host"] = "127.0.0.1:25"
+ }
+
+ if c.IsSet("username") {
+ vals["username"] = c.String("username")
+ }
+ if c.IsSet("password") {
+ vals["password"] = c.String("password")
+ }
+
+ if !c.IsSet("send-to") {
+ return fmt.Errorf("Some recipients must be provided")
+ }
+ vals["sendTos"] = c.StringSlice("send-to")
+
+ if c.IsSet("subject") {
+ vals["subject"] = c.String("subject")
+ } else {
+ vals["subject"] = "Diagnostic message from Gitea"
+ }
+
+ return commonAddLogger(c, mode, vals)
+}
+
+func runAddConnLogger(c *cli.Context) error {
+ setup("manager", c.Bool("debug"))
+ vals := map[string]interface{}{}
+ mode := "conn"
+ vals["net"] = "tcp"
+ if c.IsSet("protocol") {
+ switch c.String("protocol") {
+ case "udp":
+ vals["net"] = "udp"
+ case "unix":
+ vals["net"] = "unix"
+ }
+ }
+ if c.IsSet("address") {
+ vals["address"] = c.String("address")
+ } else {
+ vals["address"] = ":7020"
+ }
+ if c.IsSet("reconnect") {
+ vals["reconnect"] = c.Bool("reconnect")
+ }
+ if c.IsSet("reconnect-on-message") {
+ vals["reconnectOnMsg"] = c.Bool("reconnect-on-message")
+ }
+ return commonAddLogger(c, mode, vals)
+}
+
+func runAddFileLogger(c *cli.Context) error {
+ setup("manager", c.Bool("debug"))
+ vals := map[string]interface{}{}
+ mode := "file"
+ if c.IsSet("filename") {
+ vals["filename"] = c.String("filename")
+ } else {
+ return fmt.Errorf("filename must be set when creating a file logger")
+ }
+ if c.IsSet("rotate") {
+ vals["rotate"] = c.Bool("rotate")
+ }
+ if c.IsSet("max-size") {
+ vals["maxsize"] = c.Int64("max-size")
+ }
+ if c.IsSet("daily") {
+ vals["daily"] = c.Bool("daily")
+ }
+ if c.IsSet("max-days") {
+ vals["maxdays"] = c.Int("max-days")
+ }
+ if c.IsSet("compress") {
+ vals["compress"] = c.Bool("compress")
+ }
+ if c.IsSet("compression-level") {
+ vals["compressionLevel"] = c.Int("compression-level")
+ }
+ return commonAddLogger(c, mode, vals)
+}
+
+func runAddConsoleLogger(c *cli.Context) error {
+ setup("manager", c.Bool("debug"))
+ vals := map[string]interface{}{}
+ mode := "console"
+ if c.IsSet("stderr") && c.Bool("stderr") {
+ vals["stderr"] = c.Bool("stderr")
+ }
+ return commonAddLogger(c, mode, vals)
+}
+
+func commonAddLogger(c *cli.Context, mode string, vals map[string]interface{}) error {
+ if len(c.String("level")) > 0 {
+ vals["level"] = log.FromString(c.String("level")).String()
+ }
+ if len(c.String("stacktrace-level")) > 0 {
+ vals["stacktraceLevel"] = log.FromString(c.String("stacktrace-level")).String()
+ }
+ if len(c.String("expression")) > 0 {
+ vals["expression"] = c.String("expression")
+ }
+ if len(c.String("prefix")) > 0 {
+ vals["prefix"] = c.String("prefix")
+ }
+ if len(c.String("flags")) > 0 {
+ vals["flags"] = log.FlagsFromString(c.String("flags"))
+ }
+ if c.IsSet("color") {
+ vals["colorize"] = c.Bool("color")
+ }
+ group := "default"
+ if c.IsSet("group") {
+ group = c.String("group")
+ }
+ name := mode
+ if c.IsSet("name") {
+ name = c.String("name")
+ }
+ statusCode, msg := private.AddLogger(group, name, mode, vals)
+ switch statusCode {
+ case http.StatusInternalServerError:
+ fail("InternalServerError", msg)
+ }
+
+ fmt.Fprintln(os.Stdout, msg)
+ return nil
+}
+
func runShutdown(c *cli.Context) error {
- setup("manager", false)
+ setup("manager", c.Bool("debug"))
statusCode, msg := private.Shutdown()
switch statusCode {
case http.StatusInternalServerError:
@@ -68,7 +394,7 @@ func runShutdown(c *cli.Context) error {
}
func runRestart(c *cli.Context) error {
- setup("manager", false)
+ setup("manager", c.Bool("debug"))
statusCode, msg := private.Restart()
switch statusCode {
case http.StatusInternalServerError:
@@ -80,7 +406,7 @@ func runRestart(c *cli.Context) error {
}
func runFlushQueues(c *cli.Context) error {
- setup("manager", false)
+ setup("manager", c.Bool("debug"))
statusCode, msg := private.FlushQueues(c.Duration("timeout"), c.Bool("non-blocking"))
switch statusCode {
case http.StatusInternalServerError:
@@ -90,3 +416,39 @@ func runFlushQueues(c *cli.Context) error {
fmt.Fprintln(os.Stdout, msg)
return nil
}
+
+func runPauseLogging(c *cli.Context) error {
+ setup("manager", c.Bool("debug"))
+ statusCode, msg := private.PauseLogging()
+ switch statusCode {
+ case http.StatusInternalServerError:
+ fail("InternalServerError", msg)
+ }
+
+ fmt.Fprintln(os.Stdout, msg)
+ return nil
+}
+
+func runResumeLogging(c *cli.Context) error {
+ setup("manager", c.Bool("debug"))
+ statusCode, msg := private.ResumeLogging()
+ switch statusCode {
+ case http.StatusInternalServerError:
+ fail("InternalServerError", msg)
+ }
+
+ fmt.Fprintln(os.Stdout, msg)
+ return nil
+}
+
+func runReleaseReopenLogging(c *cli.Context) error {
+ setup("manager", c.Bool("debug"))
+ statusCode, msg := private.ReleaseReopenLogging()
+ switch statusCode {
+ case http.StatusInternalServerError:
+ fail("InternalServerError", msg)
+ }
+
+ fmt.Fprintln(os.Stdout, msg)
+ return nil
+}