我正在使用caffe库制作自己的c ++分类程序。 我想在caffe的模型初始化步骤中隐藏所有日志消息。
根据Disable glog's "LOG(INFO)" logging, 我可以通过设置环境变量
来禁用大多数日志GLOG_minloglevel = 2
来自命令行。
但是,我真正想要的是从可执行文件中删除所有日志,因此用户无法通过重置GLOG_minloglevel值来打开日志。
我可以找到一种方法,可以在编译时从http://rpg.ifi.uzh.ch/docs/glog.html剥离glog的日志消息。 它说我可以删除这样的日志:
> #define GOOGLE_STRIP_LOG 1 // this must go before the #include!
> #include <glog/logging.h>
由于我的应用程序使用了caffe的c ++库,我需要通过向caffe的CMakeLists.txt添加以下选项add_definitions(-DGOOGLE_STRIP_LOG=2)
来重建caffe库。
编译成功,但是当我使用新的caffe库运行我的应用程序时,它会在模型初始化步骤中因分段错误错误而停止。
我可以通过像这样运行gdb来获得更详细的错误消息:
编程接收信号SIGSEGV,分段故障。 __memcpy_sse2_unaligned()at ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S:153 153 ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S:没有这样的文件或目录
当我在caffe的CMakeLists.txt中回滚到没有add_definitions(-DGOOGLE_STRIP_LOG=2)
的原始caffe库时,我的应用程序运行良好。
任何人都可以给我一个解决这个问题的提示吗?
提前谢谢。
答案 0 :(得分:0)
考虑将google :: LogToStderr()描述为:&#34;使其成为所有日志消息仅发送给stderr。&#34; (见glog / logging.h)。
因此,无论它做什么,都可能会让我们知道如何禁用日志记录到文件。事实证明它的实现很简单:
SetStderrLogging(0); // thus everything is "also" logged to stderr
for ( int i = 0; i < NUM_SEVERITIES; ++i ) {
SetLogDestination(i, ""); // "" turns off logging to a logfile
}
因此,要禁用对文件的记录,对于所有严重性,只需要SetLogDestination()到&#34;&#34 ;.
您可能还想要禁用所有日志记录到stderr(它似乎默认为GLOG_ERROR)。这可以通过添加:
来实现google::SetStderrLogging( google::NUM_SEVERITIES );
BTW,我这样做的理由是我想将GLOG消息重定向到应用程序已经使用的不同日志框架。我发现我可以通过另外使用我自己的接收器调用google :: AddLogSink()来实现此目的。