spdlog: не удается очистить / записать в файл - PullRequest
0 голосов
/ 23 ноября 2018

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

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

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

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

1 Ответ

0 голосов
/ 04 декабря 2018

ОК, построчно просматривая код spdlog, я обнаружил источник неожиданного поведения.

Я использовал

spdlog::error(message);

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

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

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

spdlog::set_default_logger(logger);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...