从我自己的 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() 来完成此操作。
我正在使用 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() 来完成此操作。