我可以在 Glog 中设置全局日志记录级别吗?
Can I set a global logging level in Glog?
在我通常使用的语言 Java 中,日志库的一个共同特征是能够设置 "global" 日志级别 - eg 如果级别为 WARNING 或更高,则发送到日志文件,否则不发送,无论日志记录在哪个模块中完成。
我想在 Glog 中做同样的事情,结合也只记录到标准错误,而不是文件。
怎么办?
更新: 当控制传递到我的代码时,可执行文件已经启动 - 我 运行 作为 AWS Lambda 函数 - 所以我'我不确定我是否可以选择在命令行上设置 Glog 状态。我可以通过函数调用来实现吗?
我是GoLang的新手,我想我只是不了解Go的内部逻辑。因为我的心思无法穿透Glog docs。所以这个问题可能看起来很幼稚。
好吧,我浏览了文档,发现 glog 是由标志控制的,所以它们必须存在才能正常工作。在您的情况下,您必须在运行时设置它们。您将要设置 logtostderr=true
以记录到 stderr 并将严重级别设置为可能的选项之一:
stderrthreshold=[WARNING|ERROR|INFO|FATAL]
示例:
package main
import (
"flag"
"fmt"
"os"
"github.com/golang/glog"
)
func usage() {
flag.PrintDefaults()
os.Exit(2)
}
func init() {
flag.Usage = usage
flag.Set("logtostderr", "true")
flag.Set("stderrthreshold", "WARNING")
flag.Set("v", "2")
// This is wa
flag.Parse()
}
func main() {
number_of_lines := 10
for i := 0; i < number_of_lines; i++ {
glog.V(2).Infof("LINE: %d", i)
message := fmt.Sprintf("TEST LINE: %d", i)
glog.Warning(message)
}
glog.Flush()
}
输出:
$ ./Whosebug.exe
I0615 11:03:47.589969 11776 main.go:30] LINE: 0
W0615 11:03:47.590469 11776 main.go:32] TEST LINE: 0
I0615 11:03:47.590969 11776 main.go:30] LINE: 1
W0615 11:03:47.590969 11776 main.go:32] TEST LINE: 1
I0615 11:03:47.590969 11776 main.go:30] LINE: 2
W0615 11:03:47.590969 11776 main.go:32] TEST LINE: 2
I0615 11:03:47.590969 11776 main.go:30] LINE: 3
W0615 11:03:47.590969 11776 main.go:32] TEST LINE: 3
I0615 11:03:47.590969 11776 main.go:30] LINE: 4
W0615 11:03:47.590969 11776 main.go:32] TEST LINE: 4
I0615 11:03:47.591469 11776 main.go:30] LINE: 5
W0615 11:03:47.591469 11776 main.go:32] TEST LINE: 5
I0615 11:03:47.591469 11776 main.go:30] LINE: 6
W0615 11:03:47.591469 11776 main.go:32] TEST LINE: 6
I0615 11:03:47.591469 11776 main.go:30] LINE: 7
W0615 11:03:47.591469 11776 main.go:32] TEST LINE: 7
I0615 11:03:47.591469 11776 main.go:30] LINE: 8
W0615 11:03:47.591469 11776 main.go:32] TEST LINE: 8
I0615 11:03:47.591469 11776 main.go:30] LINE: 9
W0615 11:03:47.591469 11776 main.go:32] TEST LINE: 9
据我所知,它们没有提供您正在寻找的功能。然而,这似乎是你可以很容易地使用 Adapter Pattern 的东西。
我在这里为您创建了一个准系统实现:https://play.golang.org/p/LJPWwF0gTgB
不过,我建议您查看另一个日志库,它提供的内容更像您想要的。我个人使用 https://github.com/uber-go/zap,因为它还通过 Jaeger 很好地绑定到 opentracing,这是我除了写日志之外通常还需要的东西。
我认为 zap 可能感觉更正确,但我也没有关于 glog 有任何问题的用例的上下文。只是一个可能有帮助的偏好。
Kubernetes klog 是 glog 的一个分支,它解决了一些烦人的问题,比如全局 Flag 设置
https://github.com/kubernetes/klog
package main
import (
"flag"
"fmt"
"k8s.io/klog"
)
func main() {
klog.InitFlags(nil)
flag.Set("logtostderr", "true")
flag.Set("stderrthreshold", "WARNING")
flag.Set("v", "2")
flag.Parse()
number_of_lines := 10
for i := 0; i < number_of_lines; i++ {
klog.V(2).Infof("LINE: %d", i)
message := fmt.Sprintf("TEST LINE: %d", i)
klog.Warning(message)
}
klog.Flush()
}
在我通常使用的语言 Java 中,日志库的一个共同特征是能够设置 "global" 日志级别 - eg 如果级别为 WARNING 或更高,则发送到日志文件,否则不发送,无论日志记录在哪个模块中完成。
我想在 Glog 中做同样的事情,结合也只记录到标准错误,而不是文件。
怎么办?
更新: 当控制传递到我的代码时,可执行文件已经启动 - 我 运行 作为 AWS Lambda 函数 - 所以我'我不确定我是否可以选择在命令行上设置 Glog 状态。我可以通过函数调用来实现吗?
我是GoLang的新手,我想我只是不了解Go的内部逻辑。因为我的心思无法穿透Glog docs。所以这个问题可能看起来很幼稚。
好吧,我浏览了文档,发现 glog 是由标志控制的,所以它们必须存在才能正常工作。在您的情况下,您必须在运行时设置它们。您将要设置 logtostderr=true
以记录到 stderr 并将严重级别设置为可能的选项之一:
stderrthreshold=[WARNING|ERROR|INFO|FATAL]
示例:
package main
import (
"flag"
"fmt"
"os"
"github.com/golang/glog"
)
func usage() {
flag.PrintDefaults()
os.Exit(2)
}
func init() {
flag.Usage = usage
flag.Set("logtostderr", "true")
flag.Set("stderrthreshold", "WARNING")
flag.Set("v", "2")
// This is wa
flag.Parse()
}
func main() {
number_of_lines := 10
for i := 0; i < number_of_lines; i++ {
glog.V(2).Infof("LINE: %d", i)
message := fmt.Sprintf("TEST LINE: %d", i)
glog.Warning(message)
}
glog.Flush()
}
输出:
$ ./Whosebug.exe
I0615 11:03:47.589969 11776 main.go:30] LINE: 0
W0615 11:03:47.590469 11776 main.go:32] TEST LINE: 0
I0615 11:03:47.590969 11776 main.go:30] LINE: 1
W0615 11:03:47.590969 11776 main.go:32] TEST LINE: 1
I0615 11:03:47.590969 11776 main.go:30] LINE: 2
W0615 11:03:47.590969 11776 main.go:32] TEST LINE: 2
I0615 11:03:47.590969 11776 main.go:30] LINE: 3
W0615 11:03:47.590969 11776 main.go:32] TEST LINE: 3
I0615 11:03:47.590969 11776 main.go:30] LINE: 4
W0615 11:03:47.590969 11776 main.go:32] TEST LINE: 4
I0615 11:03:47.591469 11776 main.go:30] LINE: 5
W0615 11:03:47.591469 11776 main.go:32] TEST LINE: 5
I0615 11:03:47.591469 11776 main.go:30] LINE: 6
W0615 11:03:47.591469 11776 main.go:32] TEST LINE: 6
I0615 11:03:47.591469 11776 main.go:30] LINE: 7
W0615 11:03:47.591469 11776 main.go:32] TEST LINE: 7
I0615 11:03:47.591469 11776 main.go:30] LINE: 8
W0615 11:03:47.591469 11776 main.go:32] TEST LINE: 8
I0615 11:03:47.591469 11776 main.go:30] LINE: 9
W0615 11:03:47.591469 11776 main.go:32] TEST LINE: 9
据我所知,它们没有提供您正在寻找的功能。然而,这似乎是你可以很容易地使用 Adapter Pattern 的东西。
我在这里为您创建了一个准系统实现:https://play.golang.org/p/LJPWwF0gTgB
不过,我建议您查看另一个日志库,它提供的内容更像您想要的。我个人使用 https://github.com/uber-go/zap,因为它还通过 Jaeger 很好地绑定到 opentracing,这是我除了写日志之外通常还需要的东西。
我认为 zap 可能感觉更正确,但我也没有关于 glog 有任何问题的用例的上下文。只是一个可能有帮助的偏好。
Kubernetes klog 是 glog 的一个分支,它解决了一些烦人的问题,比如全局 Flag 设置
https://github.com/kubernetes/klog
package main
import (
"flag"
"fmt"
"k8s.io/klog"
)
func main() {
klog.InitFlags(nil)
flag.Set("logtostderr", "true")
flag.Set("stderrthreshold", "WARNING")
flag.Set("v", "2")
flag.Parse()
number_of_lines := 10
for i := 0; i < number_of_lines; i++ {
klog.V(2).Infof("LINE: %d", i)
message := fmt.Sprintf("TEST LINE: %d", i)
klog.Warning(message)
}
klog.Flush()
}