Как включить / отключить ведение журнала spdlog в коде?
Я создаю модули библиотеки C++ в моем приложении. Для ведения журнала я использую spdlog. Но в производственной среде я не хочу, чтобы мои модули lib делали какие-либо записи. Одним из способов включения / выключения было бы засорять мой код условными выражениями #ifdef, такими как...
#ifdef logging
// call the logger here.
#endif
Я ищу способ избежать написания этих условий. Может быть функцией-оберткой, которая выполняет проверку #ifdef и записывает ее. Но проблема с этим подходом заключается в том, что мне приходится писать оболочки для каждого метода ведения журнала (например, info, trace, warn, error, ...)
Есть ли способ лучше?
2 ответа
Вы можете отключить вход с 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);
Вы можете отключить ведение журнала перед компиляцией кода, добавив следующий макрос (перед включением spdlog.h):
#define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_OFF
#include<spdlog.h>
Это объясняется как комментарий в файле https://github.com/gabime/spdlog/blob/v1.x/include/spdlog/spdlog.h:
//
// enable/disable log calls at compile time according to global level.
//
// define SPDLOG_ACTIVE_LEVEL to one of those (before including spdlog.h):
// SPDLOG_LEVEL_TRACE,
// SPDLOG_LEVEL_DEBUG,
// SPDLOG_LEVEL_INFO,
// SPDLOG_LEVEL_WARN,
// SPDLOG_LEVEL_ERROR,
// SPDLOG_LEVEL_CRITICAL,
// SPDLOG_LEVEL_OFF
//
Использование этого макроса также ускорит ваш продуктивный код, потому что вызовы регистрации полностью удаляются из вашего кода. Поэтому этот подход может быть лучше, чем использованиеmy_logger->set_level(spdlog::level::off);
Однако для того, чтобы полное удаление кода работало, вам необходимо использовать любой из макросов при регистрации:
SPDLOG_LOGGER_###(logger, ...)
SPDLOG_###(...)
где ###
один из TRACE
, DEBUG
, INFO
, WARN
, ERROR
, CRITICAL
.
Последний макрос использует регистратор по умолчанию spdlog::default_logger_raw()
, первый можно использовать с вашими пользовательскими регистраторами. Вариативные аргументы...
обозначают обычные аргументы вашего вызова журналирования: строка fmt, за которой следуют некоторые значения для вставки в сообщение.
Я не знаю, spdlog.
Однако вы можете определить макрос в одном из ваших общих используемых включаемых файлов, чтобы заменить лог-вызов ничем, или вызов пустой встроенной функции, которую оптимизатор компилятора исключит.
в "app.h"
#ifndef LOG
#ifdef logging
#define LOG spdlog
#endif
#ifndef logging
#define LOG noop
#endif
#endif
Вы поняли идею?
Это оставит большую часть вашего кода нетронутым