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);

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

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