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