Я чувствую себя дураком, спрашивающим об этом, поскольку это примерно такой простой пример, как я могу себе представить, но он удерживает меня.
Я реализовал очень простой консольно-файловый регистратор:
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(); });
но это, похоже, ничего не делает …
Хорошо, после построчного прохождения кода spdlog я обнаружил источник неожиданного поведения.
Я использую
spdlog::error(message);
и связанные функции для ведения журнала, так как они не требуют создания каких-либо синглетонов или чего-либо еще.
Глядя на код, эти функции всегда используйте регистратор по умолчанию, а метод spdlog: register_logger не устанавливает регистратор по умолчанию (я не знаю, что он делает).
Если вместо этого вы используете следующий код:
spdlog::set_default_logger(logger);
Кажется, работает нормально.
Других решений пока нет …