2016-07-04 63 views
0

我正在使用caffe庫製作我自己的C++分類程序。 我想在caffe的模型初始化步驟中隱藏所有的日誌消息。從我自己的C++程序剝離caffe的日誌消息

根據Disable glog's "LOG(INFO)" logging, 我可以通過從命令線設定環境變量

GLOG_minloglevel = 2

禁用大部分日誌。

但是,我真正想要的是從可執行文件本身刪除所有日誌,因此用戶無法通過重新GLOG_minloglevel值上的日誌轉。

我能找到一種方法,從http://rpg.ifi.uzh.ch/docs/glog.html剝去編譯時出入記錄的日誌信息。 它說我可以刪除日誌是這樣的:因爲我的應用程序使用朱古力的C++庫

> #define GOOGLE_STRIP_LOG 1 // this must go before the #include! 
> #include <glog/logging.h> 

,我需要重建朱古力庫添加下列選項add_definitions(-DGOOGLE_STRIP_LOG=2)以朱古力的的CMakeLists.txt。 編譯成功,但是當我用新的caffe庫運行我的應用程序時,它在模型初始化步驟中停止了分段錯誤錯誤。 我可以通過像這樣運行gdb來獲得更詳細的錯誤信息:

程序接收到的信號SIGSEGV,分段錯誤。 __memcpy_sse2_unaligned()在../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S:153 153 ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S:沒有這樣的文件或目錄

當我朱古力的的CMakeLists.txt回滾到原來的朱古力庫沒有add_definitions(-DGOOGLE_STRIP_LOG=2),我的應用程序運行正常。

任何人都可以給我一個解決這個問題的提示嗎?

預先感謝您。

+1

爲什麼你想刪除日誌記錄 - 不知道它在某些時候有用嗎? –

回答

0

考慮,谷歌:: LogToStderr()被描述爲:「讓這個所有日誌消息只去標準錯誤。」 (請參閱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); 

BTW,我這樣做的理由是,我想出入記錄的消息由應用程序使用已經重定向到一個不同的日誌框架。我發現我可以通過另外調用google :: AddLogSink()和我自己的接收器來完成此任務。