spdlog: не удается очистить / записать в файл

Я чувствую себя дураком, спрашивающим об этом, поскольку это примерно такой простой пример, как я могу себе представить, но он удерживает меня.

Я реализовал очень простой консольно-файловый регистратор:

    auto logger = spdlog::basic_logger_mt("console and file logger", filepath);
#ifdef NDEBUG
spdlog::set_level(spdlog::level::info); // Set global log level to info
#else
spdlog::set_level(spdlog::level::trace); // Set global log level to everything
#endif
spdlog::set_pattern("%^%l: %v%$");    // see https://github.com/gabime/spdlog/wiki/3.-Custom-formatting
spdlog::flush_on(spdlog::level::info);

Это пишет в консоль отлично в цветах, но, хотя он создает файл журнала, он никогда не пишет в него.

Я хочу попробовать очистить его вручную, но там нет spdlog :: flush.

Первоначально я реализовал это с двумя приемниками (одна консоль, один файл), и имел аналогичный проблема: кроме как в этом случае он будет писать первый (и только первое) сообщение в файл журнала, если это была ошибка.

Я прошу прощения за такой странный вопрос …

—————————— РЕДАКТИРОВАТЬ —————————————

Попытка 1 (из примера с несколькими приемниками):

    // Creating console logger --------------------
auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();

// Creating file logger -----------------------
auto file_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>(filepath);

// Creating multi-logger ----------------------
spdlog::logger logger("console and file", { console_sink, file_sink });
spdlog::flush_on(spdlog::level::info);

Результат: файл журнала создан, ведение журнала консоли отлично, но файл остается определенно пустым.

Попытка 2 (из основного примера):

    // Creating the logger ------------------------
auto logger = spdlog::basic_logger_mt("console and $ME file", filepath);
spdlog::set_level(spdlog::level::trace); // Set global log level to everything
spdlog::flush_on(spdlog::level::info);

Результат: тот же

Единственный раз, когда мне кажется, что я продвинулся дальше, это когда я установил уровень журнала как «ошибка», а затем, если следующий журнал будет ошибкой, он появится в файле. Других сообщений в файле нет.

Я также не смог найти ручную промывку. Я попытался использовать пример:

spdlog::apply_all([&](std::shared_ptr<spdlog::logger> l) {l->flush(); });

но это, похоже, ничего не делает …

0

Решение

Хорошо, после построчного прохождения кода spdlog я обнаружил источник неожиданного поведения.

Я использую

spdlog::error(message);

и связанные функции для ведения журнала, так как они не требуют создания каких-либо синглетонов или чего-либо еще.

Глядя на код, эти функции всегда используйте регистратор по умолчанию, а метод spdlog: register_logger не устанавливает регистратор по умолчанию (я не знаю, что он делает).

Если вместо этого вы используете следующий код:

spdlog::set_default_logger(logger);

Кажется, работает нормально.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]