code.gitea.io/gitea@v1.22.3/cmd/manager_logging.go (about)

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