убрать сообщение журнала caffe из моей собственной программы на С++

Я делаю свою собственную программу классификации С++, используя библиотеку caffe. Я хочу скрыть все сообщения журнала на этапе инициализации модели caffe.

В соответствии с Отключить ведение журнала glog (INFO), я мог бы отключить большинство журналов, установив переменную среды

GLOG_minloglevel=2

из командной строки.

Но я действительно хочу удалить все журналы из самого исполняемого файла, чтобы пользователь не мог включить журналы, сбросив значение GLOG_minloglevel.

Я мог бы найти способ удалить сообщение журнала glog во время компиляции с http://rpg.ifi.uzh.ch/docs/glog.html. Он говорит, что я могу удалить журналы следующим образом:

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

Поскольку мое приложение использует библиотеку c++ caffe, мне нужно было перестроить библиотеку caffe, добавив следующую опцию add_definitions(-DGOOGLE_STRIP_LOG=2) в CMakeLists.txt 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 без add_definitions(-DGOOGLE_STRIP_LOG=2) в CMakeLists.txt caffe, мое приложение работает нормально.

Может ли кто-нибудь дать мне подсказку для решения этой проблемы?

Заранее спасибо.


person Gabriel Kang    schedule 04.07.2016    source источник
comment
Любопытно, почему вы хотите удалить ведение журнала - разве это не может быть полезно в какой-то момент?   -  person Jesper Juhl    schedule 04.07.2016


Ответы (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() со своим собственным приемником.

person Droid Coder    schedule 04.09.2016