Как включить / отключить ведение журнала 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

Вы поняли идею?

Это оставит большую часть вашего кода нетронутым

Другие вопросы по тегам