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

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

本文关键字:Caffe 日志 记录 消息 剥离 自己的 我自己 程序      更新时间:2023-10-16

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

根据禁用日志's "LOG(INFO)"日志记录,我可以通过设置环境变量

来禁用大多数日志

GLOG_minloglevel = 2

from command line.

但是,我真正想要的是删除可执行文件本身的所有日志,这样用户就不能通过重置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库,并在caffe的CMakeLists.txt中添加以下选项add_definitions(-DGOOGLE_STRIP_LOG=2)。编译是成功的,但是当我用新的caffe库运行我的应用程序时,它在模型初始化步骤中停止了分割错误。我可以通过像这样运行gdb来获得更详细的错误信息:

程序收到信号SIGSEGV,分段错误。../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S153 . ./sysdeps/x86_64/multiarch/memcpy-sse2-unaligned。S:没有这样的文件或目录

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

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

提前感谢。

考虑将google::LogToStderr()描述为:"使所有日志消息仅转到stderr。"(见蒟蒻阁/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 );

BTW,我这样做的理由是,我想重定向GLOG消息到一个不同的日志框架已经在使用的应用程序。我发现我可以通过额外调用google::AddLogSink()来实现这一点,与我自己的sink。