【问题标题】:glog flag redefined errorglog 标志重新定义错误
【发布时间】:2016-09-14 01:02:45
【问题描述】:

我在我的项目中使用 glog 标志 log_dir。最近我导入了 kubernetes 库并开始出现这种运行时恐慌

恐慌:./aaa.test 重新定义标志:log_dir

May 16 23:51:35 ecmdev03-core01 docker[26867]: goroutine 1 [running]:
May 16 23:51:35 ecmdev03-core01 docker[26867]: panic(0x15ebc60, 0xc8201aae90)
May 16 23:51:35 ecmdev03-core01 docker[26867]:         /usr/local/go/src/runtime/panic.go:464 +0x3e6
May 16 23:51:35 ecmdev03-core01 docker[26867]: flag.(*FlagSet).Var(0xc8200160c0, 0x7f561118c1c0, 0xc8201aae40, 0x1bddd70, 0x7, 0x1d75860, 0x2f)
May 16 23:51:35 ecmdev03-core01 docker[26867]:         /usr/local/go/src/flag/flag.go:776 +0x454
May 16 23:51:35 ecmdev03-core01 docker[26867]: flag.(*FlagSet).StringVar(0xc8200160c0, 0xc8201aae40, 0x1bddd70, 0x7, 0x0, 0x0, 0x1d75860, 0x2f)
May 16 23:51:35 ecmdev03-core01 docker[26867]:         /usr/local/go/src/flag/flag.go:679 +0xc7
May 16 23:51:35 ecmdev03-core01 docker[26867]: flag.(*FlagSet).String(0xc8200160c0, 0x1bddd70, 0x7, 0x0, 0x0, 0x1d75860, 0x2f, 0xc8201aae30)
May 16 23:51:35 ecmdev03-core01 docker[26867]:         /usr/local/go/src/flag/flag.go:692 +0x83
May 16 23:51:35 ecmdev03-core01 docker[26867]: flag.String(0x1bddd70, 0x7, 0x0, 0x0, 0x1d75860, 0x2f, 0xba3950)
May 16 23:51:35 ecmdev03-core01 docker[26867]:         /usr/local/go/src/flag/flag.go:699 +0x5f
May 16 23:51:35 ecmdev03-core01 docker[26867]: k8s.io/kubernetes/vendor/github.com/golang/glog.init()
May 16 23:51:35 ecmdev03-core01 docker[26867]:         /src/ecm_infra/go/src/k8s.io/kubernetes/vendor/github.com/golang/glog/glog_file.go:41 +0x13e
May 16 23:51:35 ecmdev03-core01 docker[26867]: k8s.io/kubernetes/pkg/labels.init()
May 16 23:51:35 ecmdev03-core01 docker[26867]:         /src/ecm_infra/go/src/k8s.io/kubernetes/pkg/labels/selector.go:810 +0x6b
May 16 23:51:35 ecmdev03-core01 docker[26867]: k8s.io/kubernetes/pkg/api/unversioned.init()
May 16 23:51:35 ecmdev03-core01 docker[26867]:         /src/ecm_infra/go/src/k8s.io/kubernetes/pkg/api/unversioned/well_known_labels.go:30 +0x6f
May 16 23:51:35 ecmdev03-core01 docker[26867]: k8s.io/kubernetes/pkg/api.init()
May 16 23:51:35 ecmdev03-core01 docker[26867]:         /src/ecm_infra/go/src/k8s.io/kubernetes/pkg/api/types.go:2731 +0x64

看起来 k8s 提供的 glog 库与我正在使用的库冲突。引入供应商目录是否可以解决此问题?我应该使用 glide、govendor、gb 等供应商库吗?如果是,首选哪一个?

【问题讨论】:

    标签: go kubernetes glog


    【解决方案1】:

    该错误与库冲突无关,它是一个冲突标志 (log_dir)。这意味着您正在添加一个“--log_dir”标志,并且 kubernetes 使用的 glog 库也有一个 log_dir 标志。这是在包初始化期间在库中添加标志的问题。不幸的是,供应商不会改变任何事情。当您导入日志库或 kubernetes 时,您可以通过操纵 flag.CommandLine 全局变量以指向不同的 flag.FlagSet 来解决此问题,但这会很棘手,因为它取决于导入顺序。

    【讨论】:

    • 请注意,Kubernetes 刚刚迁移到 glog 的一个分支 (k8s.io/klog),部分是为了解决其中的一些问题。
    【解决方案2】:

    在使用 glide 供应我的依赖项时,我遇到了类似的问题。

    根据https://github.com/kubernetes/kubernetes/issues/25572 kubernetes 没有 glide.lock / glide.yml,依赖扁平化不会发生,最后 glog 被定义了两次,因为 vendor/k8s.io/kubernetes/vendor 也包括在内。

    上述链接中的解决方法对我很有效:

    glide install --strip-vendor --strip-vcs

    【讨论】:

      【解决方案3】:

      我使用 k8s 库,也遇到了flag redefined: log_dir 的问题。 我发现有几个kubernetes包不在我的vendor中。然后我govendor add他们,然后它被修复了。

      我猜当在我的供应商文件夹中找不到这些包时,构建了两个 glog 副本(一个在我的供应商文件夹中,一个在我的 $GOPATH 中的 k8s.io/kubernetes/vendor 中)。

      如何找出丢失的包裹?我用笨办法,把$GOPATH/src/k8s.io改成别的名字,然后自己建项目,看看没找到什么的,再添加吧~

      【讨论】:

        【解决方案4】:

        我看到flag redefined: log_dir 错误,堆栈跟踪指向glog/glog_file.go:41 +0xd3

        问题的根本原因是GOPATH

        我在不同的位置有两个相同的 repo 副本。在尝试在其中一个副本中运行测试时,go 包是从另一个 repo 中挑选出来的。所以我在glog 中有两个定义。

        我将另一个 repo 重命名为新名称,然后它开始工作。

        所以,请检查您的 GOPATH 并确保您没有从其他地方导入库。

        【讨论】:

          【解决方案5】:
          if flag.CommandLine.Lookup("log_dir") != nil {
              flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
          }
          klog.InitFlags(nil)  // add the block above before invoking klog.InitFlags()
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-08-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多