glog 标志重新定义错误

16

我在我的项目中使用了glog flag log_dir。最近我导入了kubernetes库,开始出现这个运行时panic:

panic: ./aaa.test flag redefined: 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 库和我正在使用的库发生了冲突。引入 vendor 目录是解决这个问题的方法吗?我应该使用像 glide、govendor、gb 等依赖管理工具吗?如果是,哪个是首选?

5个回答

5
那个错误与冲突的库无关,而是与冲突的标志(log_dir)有关。这意味着你正在添加一个“--log_dir”标志,而kubernetes使用的glog库也有一个log_dir标志。这是在包初始化期间向库中添加标志时出现的问题。不幸的是,vendoring 不会改变任何东西。你可能能够通过操作flag.CommandLine全局变量,在导入日志库或kubernetes时将其指向不同的flag.FlagSet来解决此问题,但这将很棘手,因为它取决于导入顺序。

2
请注意,Kubernetes刚刚转移到glog的分支(k8s.io/klog),部分原因是为了解决这些问题。 - Tim Allclair

3

当我使用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”问题。我发现我本地的vendor文件夹中缺少几个Kubernetes包。然后我使用“govendor add”命令添加了它们,问题就解决了。

我猜测当这些包在我的本地vendor文件夹中找不到时,可能会构建两份glog拷贝(一份在我的vendor文件夹里,另一份在$GOPATH中的k8s.io/kubernetes/vendor目录下)。

如何找出缺失的包?我的方法很愚蠢:将$GOPATH/src/k8s.io重命名为其他名称,然后构建我的项目,看看缺少什么。然后再添加它们即可~


1
我看到了一个错误信息:“flag redefined: log_dir”,堆栈跟踪指向“glog/glog_file.go:41 +0xd3”。
问题的根本原因是“GOPATH”。
我在不同的位置有两个相同代码库的副本。在尝试运行一个副本中的测试时,go包被从另一个代码库中获取。因此,我在“glog”中有两个定义。
我将另一个代码库重命名为一个新名称,然后它开始工作了。
因此,请检查您的“GOPATH”,确保您没有从其他地方导入库。

0
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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接