Ich habe ein Projekt, das cobra
和klog
verwenden muss, um eine ausführbare Datei zu generieren, das Protokoll auszudrucken und aufzubewahren.
Zuerst habe ich es mit dem klog
可以将日志同时输出到terminal和file
unten getestet.
package main import ( "flag" "k8s.io/klog" ) func init() { var fs flag.flagset klog.initflags(&fs) fs.set("logtostderr", "false") fs.set("log_file_max_size", "100") fs.set("log_file", "/home/test/workspace/klogfile/test.log") fs.set("alsologtostderr", "true") } func main() { defer klog.flush() klog.info("info") klog.warning("warning") klog.error("error") }
Datei/home/test/workspace/klogfile/test.log
ist wie folgt
log file created at: 2023/04/06 16:46:07 running on machine: s52 binary: built with gc go1.16.12 for linux/amd64 log line format: [iwef]mmdd hh:mm:ss.uuuuuu threadid file:line] msg i0406 16:46:07.751183 13512 main.go:20] info w0406 16:46:07.751594 13512 main.go:21] warning e0406 16:46:07.751629 13512 main.go:22] error
Dann habe ich es basierend auf k8s style
添加到cobra
package main import ( "flag" "github.com/spf13/cobra" "k8s.io/klog" ) var ( str = "hello world" ) func newcommand() *cobra.command { cmd := &cobra.command{ use: "echo", short: "use klog with cobra", long: "use klog together with cobra.", run: func(cmd *cobra.command, args []string) { run() }, } klog.initflags(flag.commandline) cmd.flags().addgoflagset(flag.commandline) cmd.flags().sortflags = false cmd.flags().stringvar(&str, "str", str, "string to print") return cmd } func run() { defer klog.flush() klog.infof("running, str:%s", str) } func main() { if err := newcommand().execute(); err != nil { klog.fatalf("root cmd execute failed, err=%v", err) } }
Ich kann bestehen --help
打印出required日志选项
, aber wenn ich sie umschreibe, um das Speichern in einer Datei im obigen Beispiel zu implementieren, erfolgt die Ausgabe nur an das Terminal statt in eine Datei < /strong>
# go run main2.go --logtostderr false --log_file_max_size "100" --alsologtostderr true --log_file "/home/test/workspace/klogfile/test2.log" I0406 16:52:57.479455 15217 cobra_klog.go:34] Running, str:hello world
Bitte sagen Sie mir, wo im der erforderliche Code
fehlt. Wenn vorhanden, sagen Sie mir bitte, wie ich ihn ändern kann. Vielen Dank! 缺少必要的代码
,如果有请告诉我如何修改,谢谢!
你的代码没有任何问题。唯一的问题是您必须使用 -flag=false
Richtige Antwort
-flag=false
verwenden müssen, um das boolesche Flag zu deaktivieren (siehe Befehlszeilen-Flag-Syntax--logtostderr=false
替换 --logtostderr false
).
Versuchen Sie diesen Befehl (mit --log_file_max_size "100"
可以简化为 --log_file_max_size 100
):
go run main2.go --logtostderr=false --log_file_max_size "100" --alsologtostderr true --log_file "/home/test/workspace/klogfile/test2.log"
Übrigens, denke ich .
Update
:🎜 🎜Flaggen zur Reduzierung der Klog-Exposition: 🎜package main import ( "flag" "github.com/spf13/cobra" "k8s.io/klog" ) var ( str = "hello world" + logFile string ) func NewCommand() *cobra.Command { + var fs flag.FlagSet + klog.InitFlags(&fs) cmd := &cobra.Command{ Use: "echo", Short: "use klog with cobra", Long: "Use klog together with cobra.", Run: func(cmd *cobra.Command, args []string) { + fs.Set("logtostderr", "false") + fs.Set("log_file", logFile) Run() }, } - klog.InitFlags(flag.CommandLine) - cmd.Flags().AddGoFlagSet(flag.CommandLine) cmd.Flags().SortFlags = false cmd.Flags().StringVar(&str, "str", str, "string to print") + cmd.Flags().StringVar(&logFile, "log_file", "", "If non-empty, use this log file") return cmd } func Run() { defer klog.Flush() klog.Infof("Running, str:%s", str) } func main() { if err := NewCommand().Execute(); err != nil { klog.Fatalf("root cmd execute failed, err=%v", err) } }
Das obige ist der detaillierte Inhalt vonSo kombinieren Sie Cobra und Klog. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!