Maison >développement back-end >Golang >Comment combiner cobra et klog

Comment combiner cobra et klog

WBOY
WBOYavant
2024-02-06 10:51:071156parcourir

如何结合 cobra 和 klog

Contenu de la question

J'ai un projet qui doit utiliser cobraklog pour générer un fichier exécutable, imprimer le journal et le conserver.

Je l'ai d'abord testé, en utilisant le klog可以将日志同时输出到terminal和file ci-dessous.

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")
}
Le contenu du

fichier/home/test/workspace/klogfile/test.log est le suivant

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

Ensuite, j'ai essayé en me basant sur 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)
    }
}

Je peux réussir --help打印出required日志选项 mais lorsque je les réécris pour implémenter l'enregistrement dans un fichier dans l'exemple ci-dessus, ne sort que vers le terminal au lieu de vers un fichier

# 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

Veuillez me dire où le manque le code nécessaire S'il y en a, dites-moi comment le modifier, merci ! 缺少必要的代码,如果有请告诉我如何修改,谢谢!


正确答案


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

Bonne réponse

Il n'y a rien de mal avec votre code. Le seul problème est que vous devez utiliser le formulaire -flag=false pour désactiver le drapeau booléen (voir

Syntaxe du drapeau de ligne de commande--logtostderr=false 替换 --logtostderr false).

Essayez cette commande (avec --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"

Au fait, je pense .

Mise à jour

 :🎜 🎜Drapeaux pour réduire l'exposition aux klogs : 🎜
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)
    }
 }

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer