1

我正在使用 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>

add_definitions(-DGOOGLE_STRIP_LOG=2)由于我的应用程序使用 caffe 的 c++ 库,我需要通过在 caffe 的 CMakeLists.txt中添加以下选项来重建 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: 没有这样的文件或目录

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

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

先感谢您。

4

1 回答 1

0

考虑到 google::LogToStderr() 被描述为:“让所有日志消息只发送到 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() 来完成此操作。

于 2016-09-04T00:00:21.183 回答