glog.Infoln无法输出到控制台问题求助
问题原因及解决方案
原因分析
这个问题是Google glog 库的默认行为导致的:
glog.Infoln属于Info级别日志,默认仅写入日志文件,且会进行缓冲,在程序持续运行(比如你的HTTP服务)时,缓冲内容不会主动刷新到控制台或文件。glog.Errorln属于Error级别日志,默认会直接输出到标准错误(控制台),且无缓冲延迟,所以能立即看到输出。
另外,glog 默认不会将Info级别日志输出到控制台,仅Error及以上级别会同步输出到控制台。
解决方案
有两种方式可以让Info日志输出到控制台:
方式1:启动时添加命令行参数
运行程序时加上 -logtostderr=true 参数,强制所有级别日志输出到控制台:
./your-program -logtostderr=true -port=50080
方式2:代码中配置glog
在代码里显式设置日志输出到标准错误,需要在 flag.Parse() 之前调用相关配置(因为glog依赖flag包管理参数):
修改main.go的flag相关代码段:
// 先初始化glog的配置,强制日志输出到控制台 flag.Set("logtostderr", "true") flag.StringVar(&PORT, "port", "50080", "--port=50080 or -port=50080") flag.Parse()
如果需要让Info日志立即刷新(避免缓冲延迟),可以在写入日志后手动调用glog.Flush(),比如修改中间件:
func WriteToConsole(next http.Handler) http.Handler{ return http.HandlerFunc(func(w http.ResponseWriter,r *http.Request){ glog.Infoln(fmt.Sprintf("%v called",r.Method)) glog.Flush() // 手动刷新缓冲,立即输出日志 next.ServeHTTP(w,r) }) }
注意:手动刷新会带来一定性能开销,仅在必要场景使用。
内容的提问来源于stack exchange,提问作者Scáthach
相关产品推荐
相关产品推荐

