从我自己的c ++程序中删除caffe的日志消息

时间:2016-07-04 13:19:08

标签: c++ caffe glog

我正在使用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库时,我的应用程序运行良好。

任何人都可以给我一个解决这个问题的提示吗?

提前谢谢。

1 个答案:

答案 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()来实现此目的。