最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • 如何结合 cobra 和 klog

    如何结合 cobra 和 klog

    问题内容

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

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

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

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

    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

    然后我尝试基于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)
        }
    }

    我可以通过--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)
        }
     }
    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » 如何结合 cobra 和 klog
    • 7会员总数(位)
    • 25846资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 293稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情