首页 > 后端开发 > Golang > 如何结合 cobra 和 klog

如何结合 cobra 和 klog

WBOY
发布: 2024-02-06 10:51:07
转载
1198 人浏览过

如何结合 cobra 和 klog

问题内容

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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的内容如下

1

2

3

4

5

6

7

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

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日志选项,但是当我重写它们以实现上例中的保存到文件时,仅将输出输出到终端而不是输出到文件< /strong>

1

2

# 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

正确答案

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

命令行标志语法--logtostderr=false 替换 --logtostderr false)。

尝试此命令(用 --log_file_max_size "100" 可以简化为 --log_file_max_size 100):

1

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

登录后复制

顺便说一句,我认为

更新

:🎜 🎜减少 klog 暴露的标志:🎜

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

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的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:stackoverflow.com
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板