Я создаю модули библиотеки C ++ в моем приложении. Для ведения журнала я использую spdlog. Но в производственной среде я не хочу, чтобы мои модули lib делали какие-либо записи. Одним из способов включения / выключения было бы засорять мой код условными выражениями #ifdef, такими как …
#ifdef logging
// call the logger here.
#endif
Я ищу способ избежать написания этих условий. Может быть функцией-оберткой, которая выполняет проверку #ifdef и записывает ее. Но проблема с этим подходом заключается в том, что мне приходится писать оболочки для каждого метода ведения журнала (например, info, trace, warn, error, …)
Есть ли способ лучше?
Я не знаю, spdlog.
Однако вы можете определить макрос в одном из ваших общих используемых включаемых файлов, чтобы заменить лог-вызов ничем, или вызов пустой встроенной функции, которую оптимизатор компилятора исключит.
в «app.h»
#ifndef LOG
#ifdef logging
#define LOG spdlog
#endif
#ifndef logging
#define LOG noop
#endif
#endif
Вы поняли идею?
Это оставит большую часть вашего кода нетронутым
Вы можете отключить вход с set_level()
:
auto my_logger = spdlog::basic_logger_mt("basic_logger", "logs/basic.txt");
#if defined(PRODUCTION)
my_logger->set_level(spdlog::level::off);
#else
my_logger->set_level(spdlog::level::trace);
#endif
spdlog::register_logger(my_logger);