如何结合 cobra 和 klog

如何结合 cobra 和 klog

问题内容

我有一个项目需要使用cobra和klog来生成可执行文件并打印日志并保留。

首先我测试了一下,使用下面的klog可以将日志同时输出到terminal和file。

package mainimport (    "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")}

登录后复制

文件/home/test/workspace/klogfile/test.log的内容如下

log file created at: 2023/04/06 16:46:07running on machine: s52binary: built with gc go1.16.12 for linux/amd64log line format: [iwef]mmdd hh:mm:ss.uuuuuu threadid file:line] msgi0406 16:46:07.751183   13512 main.go:20] infow0406 16:46:07.751594   13512 main.go:21] warninge0406 16:46:07.751629   13512 main.go:22] error

登录后复制

然后我尝试基于k8s style添加到cobra

package mainimport (    "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)    }}

登录后复制

我可以通过–help打印出required日志选项,但是当我重写它们以实现上例中的保存到文件时,仅将输出输出到终端而不是输出到文件

# 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

登录后复制

请问我哪里的缺少必要的代码,如果有请告诉我如何修改,谢谢!

正确答案

你的代码没有任何问题。唯一的问题是您必须使用 -flag=false 表单来关闭布尔标志(请参阅 命令行标志语法)。

尝试此命令(用 –logtostderr=false 替换 –logtostderr false):

go run main2.go --logtostderr=false --log_file_max_size "100" --alsologtostderr true --log_file "/home/test/workspace/klogfile/test2.log"

登录后复制

顺便说一句,我认为 –log_file_max_size “100” 可以简化为 –log_file_max_size 100。

更新

减少 klog 暴露的标志:

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)    } }

登录后复制

以上就是如何结合 cobra 和 klog的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2485378.html

(0)
上一篇 2025年3月4日 21:45:15
下一篇 2025年3月4日 21:45:35

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论