【问题标题】:strip caffe's logging message from my own c++ program从我自己的 C++ 程序中剥离 caffe 的日志消息
【发布时间】:2016-09-05 16:19:53
【问题描述】:

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

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

提前谢谢你。

【问题讨论】:

  • 很好奇您为什么要删除日志记录 - 它在某些时候有用吗?

标签: c++ caffe glog


【解决方案1】:

考虑到 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() 来完成此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    相关资源
    最近更新 更多