spdlog:无法刷新/写入文件

时间:2018-11-23 12:21:32

标签: c++ 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。

我本来是用两个接收器(一个控制台,一个文件)实现的,并且有一个相似问题:除非在这种情况下,它会先写 first (而且(只有第一条)消息,只要它是一个错误。

很抱歉提出这样一个点头问题...

--------------------------------编辑---------------- -----------------------

尝试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 :(得分:1)

好的,逐行查看了spdlog代码后,我发现了意外行为的根源。

我一直在使用

spdlog::error(message);

和相关功能进行日志记录,因为这些不需要创建任何单例或任何内容。

看看代码,这些功能总是使用默认记录器,而方法spdlog:register_logger不会设置默认记录器(我不知道它的作用)。

如果您改用以下代码:

spdlog::set_default_logger(logger);

似乎工作正常。