从我自己的 C++ 程序中剥离 caffe 的日志消息

strip caffe's logging message from my own c++ program

我正在使用 caffe 库制作自己的 c++ 分类程序。 我想在 caffe 的模型初始化步骤中隐藏所有日志消息。

根据, 我可以通过设置环境变量

来禁用大部分日志

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++ 库,因此我需要通过将以下选项 add_definitions(-DGOOGLE_STRIP_LOG=2) 添加到 caffe 的 CMakeLists.txt 来重建 caffe 库。 编译成功,但是当我 运行 我的应用程序使用新的 caffe 库时,它在模型初始化步骤期间因分段错误而停止。 我可以通过 运行 gdb 得到更详细的错误消息,如下所示:

Program received signal SIGSEGV, Segmentation fault. __memcpy_sse2_unaligned () at ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S:153 153 ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S: No such file or directory

当我在 caffe 的 CMakeLists.txt 中回滚到没有 add_definitions(-DGOOGLE_STRIP_LOG=2) 的原始 caffe 库时,我的应用程序运行正常。

谁能给我一个解决这个问题的提示?

提前致谢。

考虑 google::LogToStderr() 被描述为:"Make it so that all log messages go only to stderr."(参见 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() 设置为“”。

您可能还想禁用所有到 stderr 的日志记录(它似乎默认为 GLOG_ERROR)。这可以通过添加以下内容来完成:

google::SetStderrLogging( google::NUM_SEVERITIES );

顺便说一句,我这样做的理由是我想将 GLOG 消息重定向到应用程序已在使用的不同日志记录框架。我发现我可以通过使用我自己的接收器另外调用 google::AddLogSink() 来完成此操作。