返回顶部
首页 > 资讯 > 精选 >如何结合 cobra 和 klog
  • 272
分享到

如何结合 cobra 和 klog

2024-02-06 11:02:49 272人浏览 八月长安
摘要

问题内容 我有一个项目需要使用cobra和klog来生成可执行文件并打印日志并保留。 首先我测试了一下,使用下面的klog可以将日志同时输出到terminal和file。 packag

问题内容

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

猜你喜欢
  • 如何结合 cobra 和 klog
    问题内容 我有一个项目需要使用cobra和klog来生成可执行文件并打印日志并保留。 首先我测试了一下,使用下面的klog可以将日志同时输出到terminal和file。 packag...
    99+
    2024-02-06
  • 如何在golang中使用cobra库
    如何在golang中使用cobra库?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。cobra  是 go 语言的一个库,可以用于编写命令行工具。通常我...
    99+
    2023-06-15
  • Python 和 Spring 如何结合使用?
    Python 和 Spring 是两个不同的编程语言和框架,它们分别用于不同的用途。Python 是一种高级编程语言,它被广泛应用于数据科学、机器学习、Web 开发等领域。Spring 是一种 Java 框架,它为企业级应用程序提供了一种...
    99+
    2023-06-27
    spring apache django
  • ASP.NET 和 NumPy:如何结合使用?
    ASP.NET 是一种用于构建 Web 应用程序的框架,而 NumPy 则是一个功能强大的 Python 库,用于进行科学计算和数据分析。虽然它们是不同的技术,但结合使用可以为 Web 应用程序添加更多的功能和灵活性。本文将介绍如何在 A...
    99+
    2023-09-05
    numy 编程算法 对象
  • ASP和Spring如何结合使用?
    ASP和Spring是两个不同的框架,ASP是一种微软公司开发的服务器端脚本语言,而Spring是一种Java开源框架。它们各自有自己的优点和特点,但是如果能够结合使用,可以实现更加强大的功能。 在本文中,我们将介绍ASP和Spring如...
    99+
    2023-06-04
    spring 函数 bash
  • redis和mysql如何结合使用
    结合使用 redis 和 mysql 的优势:缓存:提高应用程序性能,减少对 mysql 数据库的查询。会话管理:减轻 mysql 数据库的负担,提高可伸缩性。排行榜和队列:存储和快速访...
    99+
    2024-06-12
    mysql redis
  • 如何将Golang和Kafka结合使用
    Kafka是一个开源的分布式消息队列,在大数据应用中常常被用于构建实时数据流处理应用。而Golang则是Google开发的一种编程语言,以其高效的并发性、强大的库和生态系统而闻名。那么,如何使用Golang与Kafka进行结合呢?首先,我们...
    99+
    2023-05-14
  • ASP 和 Django 如何结合打包 NPM?
    ASP 和 Django 是两个常用的 Web 开发框架,它们都有着自己的优点和特点。在实际开发中,我们可能会同时使用这两个框架来完成一个项目。而在项目中,我们经常需要使用 NPM 包来帮助我们完成一些功能。那么如何在 ASP 和 Djan...
    99+
    2023-11-15
    npm 打包 django
  • rsync如何结合find
    这篇文章主要介绍了rsync如何结合find,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。rsync -avpz -e ssh 192.168.1.100:/ `find /...
    99+
    2023-06-09
  • NumPy和Spring:如何将它们结合使用?
    NumPy是一种用于科学计算的Python扩展库,而Spring则是Java应用程序开发的开源框架。这两个工具都拥有各自的优势和功能,将它们结合使用可以实现更加高效和强大的数据处理和应用程序开发。 在本文中,我们将介绍如何将NumPy和Sp...
    99+
    2023-09-26
    api numpy spring
  • PHP和NumPy:如何将它们结合起来?
    PHP是一种广泛使用的服务器端脚本语言,而NumPy是一个用于科学计算的Python库。两者看似毫不相关,但实际上它们可以结合起来使用,以实现更加高效和灵活的数据处理和计算。 在本文中,我们将介绍如何将PHP和NumPy结合起来,以及如何...
    99+
    2023-09-11
    numpy path numy
  • ASP和Linux:如何结合使用对象API?
    随着互联网的普及,网站的开发越来越受到人们的关注。在网站开发中,ASP和Linux是两个非常重要的技术。ASP是一种由微软公司开发的动态网页技术,主要运行在Windows平台上。而Linux则是一种开源的操作系统,广泛应用于服务器领域。本...
    99+
    2023-09-07
    linux 对象 api
  • PHP 和 NumPy:如何将它们结合使用?
    PHP 是一种流行的服务器端脚本语言,而 NumPy 是一个强大的 Python 库,用于科学计算和数据分析。虽然它们在语言和用途上有很大的区别,但将它们结合使用可以为数据处理和分析提供更多的可能性。在本文中,我们将探讨如何在 PHP 中...
    99+
    2023-07-07
    对象 numpy numy
  • ASP、Unix和IDE:如何将它们结合起来?
    在现代的软件开发中,ASP、Unix和IDE是非常常见的工具。然而,如何将它们结合起来,却是一个需要掌握一定技能的挑战。在本文中,我们将介绍如何在Unix环境下使用ASP,并使用IDE来帮助我们更快地开发和调试ASP应用程序。 一、安装A...
    99+
    2023-07-04
    unix ide 教程
  • Java和Windows如何结合编写高效算法?
    在计算机科学中,算法是指一组用于解决特定问题的计算步骤。在实际开发中,编写高效的算法是至关重要的,因为它们可以帮助我们更快地解决问题并提高程序的性能。 Java是一种广泛使用的编程语言,而Windows是一种广泛使用的操作系统。在本文中,...
    99+
    2023-08-05
    windows 编程算法 关键字
  • Python 和 load bash:如何轻松地结合使用?
    Python 和 Bash 都是非常流行的编程语言,它们在不同的场景下都有自己的优势。Python 通常用于数据分析、机器学习、Web 开发等领域,而 Bash 则是一种强大的命令行工具,可以帮助用户快速完成各种任务。在实际工作中,我们经常...
    99+
    2023-11-10
    响应 load bash
  • ASP和Spring如何结合?学习笔记分享!
    ASP和Spring是两种常见的Web开发框架,ASP是微软公司推出的一种动态Web开发框架,而Spring是Java开发中的重要框架之一。结合这两种框架可以使开发者更加高效地进行Web开发。本文将介绍ASP和Spring如何结合,同时提供...
    99+
    2023-11-14
    spring 学习笔记 http
  • 如何用GROUP BY结合聚合函数
    要使用GROUP BY结合聚合函数,首先需要在查询中使用GROUP BY来将数据分组,然后在SELECT语句中使用聚合函数来对每个分组进行计算。例如: SELECT column1, SUM(column2) FROM table ...
    99+
    2024-08-03
    sql server
  • SpringMVC+myBatis如何结合使用
    这篇文章给大家分享的是有关SpringMVC+myBatis如何结合使用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1. [代码]控制器片段     ...
    99+
    2023-06-03
  • CSS如何结合选择器和声明的分组
    本篇内容主要讲解“CSS如何结合选择器和声明的分组”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CSS如何结合选择器和声明的分组”吧! 我们可以在一个规则中结...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作