glog标志重新定义了错误

时间:2016-05-17 19:10:17

标签: go kubernetes glog

我在我的项目中使用glog flag 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等的销售库吗?如果是,哪一个更受欢迎?

4 个答案:

答案 0 :(得分:3)

该错误与冲突的库无关,它是一个冲突的标志(log_dir)。这意味着你要添加一个“--log_dir”标志,kubernetes使用的glog库也有一个log_dir标志。这是在包init期间在库中添加标志的问题。不幸的是,售卖不会改变任何东西。您可以通过在导入日志库或kubernetes时操纵flag.CommandLine全局变量指向不同的flag.FlagSet来解决此问题,但这将非常棘手,因为它取决于导入顺序。 / p>

答案 1 :(得分: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

答案 2 :(得分:3)

我使用k8s库并遇到flag redefined: log_dir问题。 我发现我的供应商中没有几个kubernetes包。然后我govendor add,然后它被修复了。

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

如何查找丢失的包裹?我使用愚蠢的方式,将$ GOPATH / src / k8s.io重命名为其他内容并构建我的项目,查看未找到的内容。然后添加它〜

答案 3 :(得分:0)

我看到<body> <aside> <svg viewBox="0 0 100 100"> <defs> <pattern id="pattern1" height="100%" width="100%" patternContentUnits="objectBoundingBox"> <image height="1" preserveAspectRatio="slice" xlink:href="https://i.imgur.com/8OtgM8B.jpg" /> </pattern> </defs> <polygon fill="url(#pattern1)" points="0,0 70,0 100,100 0,100"/> </svg> </aside> <article> <h1>Title</h1> <p>Sample Text</p> </article> </body>错误,并且堆栈跟踪指向flag redefined: log_dir

此问题的根本原因是glog/glog_file.go:41 +0xd3

我在不同的位置有两个相同的仓库的副本。尝试在其中一个副本中运行测试时,从另一个仓库中选择了go软件包。所以我在GOPATH中对所有事物都有两个定义。

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

因此,请检查您的glog并确保您没有从其他地方导入库。