问题内容 我有一个项目需要使用cobra和klog来生成可执行文件并打印日志并保留。 首先我测试了一下,使用下面的klog可以将日志同时输出到terminal和file。 packag
我有一个项目需要使用cobra
和klog
来生成可执行文件并打印日志并保留。
首先我测试了一下,使用下面的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日志选项
,但是当我重写它们以实现上例中的保存到文件时,仅将输出输出到终端而不是输出到文件< /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
请问我哪里的缺少必要的代码
,如果有请告诉我如何修改,谢谢!
你的代码没有任何问题。唯一的问题是您必须使用 -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的详细内容,更多请关注编程网其它相关文章!
--结束END--
本文标题: 如何结合 cobra 和 klog
本文链接: https://lsjlt.com/news/561433.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0