package commands import ( "fmt" "io" cmds "gx/ipfs/QmRRovo1DE6i5cMjCbf19mQCSuszF6SKwdZNUMS7MtBnH1/go-ipfs-cmds" logging "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log" lwriter "gx/ipfs/QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C/go-log/writer" cmdkit "gx/ipfs/Qmde5VP1qUkyQXKCfmEUA7bP64V2HAptbJ7phuPp7jXWwg/go-ipfs-cmdkit" ) // Golang os.Args overrides * and replaces the character argument with // an array which includes every file in the user's CWD. As a // workaround, we use 'all' instead. The util library still uses * so // we convert it at this step. var logAllKeyword = "all" var LogCmd = &cmds.Command{ Helptext: cmdkit.HelpText{ Tagline: "Interact with the daemon log output.", ShortDescription: ` 'ipfs log' contains utility commands to affect or read the logging output of a running daemon. `, }, Subcommands: map[string]*cmds.Command{ "level": logLevelCmd, "ls": logLsCmd, "tail": logTailCmd, }, } var logLevelCmd = &cmds.Command{ Helptext: cmdkit.HelpText{ Tagline: "Change the logging level.", ShortDescription: ` Change the verbosity of one or all subsystems log output. This does not affect the event log. `, }, Arguments: []cmdkit.Argument{ // TODO use a different keyword for 'all' because all can theoretically // clash with a subsystem name cmdkit.StringArg("subsystem", true, false, fmt.Sprintf("The subsystem logging identifier. Use '%s' for all subsystems.", logAllKeyword)), cmdkit.StringArg("level", true, false, `The log level, with 'debug' the most verbose and 'critical' the least verbose. One of: debug, info, warning, error, critical. `), }, Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error { args := req.Arguments subsystem, level := args[0], args[1] if subsystem == logAllKeyword { subsystem = "*" } if err := logging.SetLogLevel(subsystem, level); err != nil { return err } s := fmt.Sprintf("Changed log level of '%s' to '%s'\n", subsystem, level) log.Info(s) return res.Emit(&MessageOutput{s}) }, Encoders: cmds.EncoderMap{ cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *MessageOutput) error { fmt.Fprint(w, out.Message) return nil }), }, Type: MessageOutput{}, } var logLsCmd = &cmds.Command{ Helptext: cmdkit.HelpText{ Tagline: "List the logging subsystems.", ShortDescription: ` 'ipfs log ls' is a utility command used to list the logging subsystems of a running daemon. `, }, Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error { return res.Emit(&stringList{logging.GetSubsystems()}) }, Encoders: cmds.EncoderMap{ cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, list *stringList) error { for _, s := range list.Strings { fmt.Fprintln(w, s) } return nil }), }, Type: stringList{}, } var logTailCmd = &cmds.Command{ Helptext: cmdkit.HelpText{ Tagline: "Read the event log.", ShortDescription: ` Outputs event log messages (not other log messages) as they are generated. `, }, Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error { ctx := req.Context r, w := io.Pipe() go func() { defer w.Close() <-ctx.Done() }() lwriter.WriterGroup.AddWriter(w) return res.Emit(r) }, }