Maison >développement back-end >Golang >Comment combiner cobra et klog
J'ai un projet qui doit utiliser cobra
和klog
pour générer un fichier exécutable, imprimer le journal et le conserver.
Je l'ai d'abord testé, en utilisant le klog
可以将日志同时输出到terminal和file
ci-dessous.
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") }Le contenu du
fichier/home/test/workspace/klogfile/test.log
est le suivant
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
Ensuite, j'ai essayé en me basant sur 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) } }
Je peux réussir --help
打印出required日志选项
mais lorsque je les réécris pour implémenter l'enregistrement dans un fichier dans l'exemple ci-dessus, ne sort que vers le terminal au lieu de vers un fichier
# 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
Veuillez me dire où le manque le code nécessaire
S'il y en a, dites-moi comment le modifier, merci ! 缺少必要的代码
,如果有请告诉我如何修改,谢谢!
你的代码没有任何问题。唯一的问题是您必须使用 -flag=false
Bonne réponse
-flag=false
pour désactiver le drapeau booléen (voir Syntaxe du drapeau de ligne de commande--logtostderr=false
替换 --logtostderr false
).
Essayez cette commande (avec --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"
Au fait, je pense .
Mise à jour
:🎜 🎜Drapeaux pour réduire l'exposition aux klogs : 🎜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) } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!