Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk menggabungkan ular tedung dan klog

Bagaimana untuk menggabungkan ular tedung dan klog

WBOY
WBOYke hadapan
2024-02-06 10:51:071159semak imbas

如何结合 cobra 和 klog

Kandungan soalan

Saya ada projek yang perlu digunakan cobraklog untuk menjana fail boleh laku dan mencetak log serta menyimpannya.

Mula-mula saya mengujinya, menggunakan klog可以将日志同时输出到terminal和file di bawah.

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

fail/home/test/workspace/klogfile/test.log adalah seperti berikut

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

Kemudian saya mencuba berdasarkan 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)
    }
}

Saya boleh lulus --help打印出required日志选项 tetapi apabila saya menulis semula mereka untuk melaksanakan penyimpanan ke fail dalam contoh di atas, hanya output ke terminal dan bukannya ke fail

# 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

Sila beritahu saya di mana kehilangan kod yang diperlukan Jika ada, sila beritahu saya cara mengubah suainya, terima kasih! 缺少必要的代码,如果有请告诉我如何修改,谢谢!


正确答案


你的代码没有任何问题。唯一的问题是您必须使用 -flag=false

Jawapan Betul

Tiada apa-apa yang salah dengan kod anda. Satu-satunya masalah ialah anda perlu mematikan bendera boolean menggunakan borang -flag=false (lihat

Command Line Flag Syntax--logtostderr=false 替换 --logtostderr false).

Cuba arahan ini (dengan --log_file_max_size "100" 可以简化为 --log_file_max_size 100):

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

By the way, saya rasa .

Kemas kini

:🎜 🎜Bendera untuk mengurangkan pendedahan 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)
    }
 }

Atas ialah kandungan terperinci Bagaimana untuk menggabungkan ular tedung dan klog. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam