目錄
正確答案
首頁 後端開發 Golang 如何結合 cobra 和 klog

如何結合 cobra 和 klog

Feb 06, 2024 am 10:51 AM

如何结合 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日誌選項,但是當我重寫它們以實現上例中的儲存到檔案時,僅將輸出輸出到終端機而不是輸出到檔案< /strong>

#
# go run main2.go --logtostderr false --log_file_max_size &quot;100&quot; --alsologtostderr true --log_file &quot;/home/test/workspace/klogfile/test2.log&quot;
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 &quot;100&quot; --alsologtostderr true --log_file &quot;/home/test/workspace/klogfile/test2.log&quot;
登入後複製

順便說一句,我認為 --log_file_max_size "100" 可以簡化為 --log_file_max_size 100

更新

減少 klog 暴露的標誌:

package main
 
 import (
    &quot;flag&quot;
    &quot;github.com/spf13/cobra&quot;
    &quot;k8s.io/klog&quot;
 )
 
 var (
    str     = &quot;hello world&quot;
+   logFile string
 )
 
 func NewCommand() *cobra.Command {
+   var fs flag.FlagSet
+   klog.InitFlags(&amp;fs)

    cmd := &amp;cobra.Command{
        Use:   &quot;echo&quot;,
        Short: &quot;use klog with cobra&quot;,
        Long:  &quot;Use klog together with cobra.&quot;,
        Run: func(cmd *cobra.Command, args []string) {
+           fs.Set(&quot;logtostderr&quot;, &quot;false&quot;)
+           fs.Set(&quot;log_file&quot;, logFile)

            Run()
        },
    }
-   klog.InitFlags(flag.CommandLine)
-   cmd.Flags().AddGoFlagSet(flag.CommandLine)
    cmd.Flags().SortFlags = false
    cmd.Flags().StringVar(&amp;str, &quot;str&quot;, str, &quot;string to print&quot;)
+   cmd.Flags().StringVar(&amp;logFile, &quot;log_file&quot;, &quot;&quot;, &quot;If non-empty, use this log file&quot;)
    return cmd
 }
 func Run() {
    defer klog.Flush()
    klog.Infof(&quot;Running, str:%s&quot;, str)
 }
 
 func main() {
    if err := NewCommand().Execute(); err != nil {
        klog.Fatalf(&quot;root cmd execute failed, err=%v&quot;, err)
    }
 }
登入後複製

以上是如何結合 cobra 和 klog的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Go語言包導入:帶下劃線和不帶下劃線的區別是什麼? Go語言包導入:帶下劃線和不帶下劃線的區別是什麼? Mar 03, 2025 pm 05:17 PM

Go語言包導入:帶下劃線和不帶下劃線的區別是什麼?

如何編寫模擬對象和存根以進行測試? 如何編寫模擬對象和存根以進行測試? Mar 10, 2025 pm 05:38 PM

如何編寫模擬對象和存根以進行測試?

Beego框架中NewFlash()函數如何實現頁面間短暫信息傳遞? Beego框架中NewFlash()函數如何實現頁面間短暫信息傳遞? Mar 03, 2025 pm 05:22 PM

Beego框架中NewFlash()函數如何實現頁面間短暫信息傳遞?

如何使用跟踪工具了解GO應用程序的執行流? 如何使用跟踪工具了解GO應用程序的執行流? Mar 10, 2025 pm 05:36 PM

如何使用跟踪工具了解GO應用程序的執行流?

如何定義GO中仿製藥的自定義類型約束? 如何定義GO中仿製藥的自定義類型約束? Mar 10, 2025 pm 03:20 PM

如何定義GO中仿製藥的自定義類型約束?

Go語言中如何將MySQL查詢結果List轉換為自定義結構體切片? Go語言中如何將MySQL查詢結果List轉換為自定義結構體切片? Mar 03, 2025 pm 05:18 PM

Go語言中如何將MySQL查詢結果List轉換為自定義結構體切片?

Go語言如何便捷地寫入文件? Go語言如何便捷地寫入文件? Mar 03, 2025 pm 05:15 PM

Go語言如何便捷地寫入文件?

我如何使用襯里和靜態分析工具來提高GO代碼的質量和可維護性? 我如何使用襯里和靜態分析工具來提高GO代碼的質量和可維護性? Mar 10, 2025 pm 05:38 PM

我如何使用襯里和靜態分析工具來提高GO代碼的質量和可維護性?

See all articles