spdlog:无法 flush/write 归档
spdlog: failing to flush/write to file
我觉得问这个问题就像个傻瓜,因为这是我能想到的最微不足道的例子,但它阻碍了我。
我已经实现了一个非常基本的控制台和文件记录器:
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);
结果:相同
唯一一次我似乎更进一步是当我将日志级别设置为 "error" 时,然后如果下一个日志是错误的,它会出现在文件中。文件中没有其他消息出现。
我也一直找不到手动冲洗。我试过使用示例:
spdlog::apply_all([&](std::shared_ptr<spdlog::logger> l) {l->flush(); });
但这似乎没有任何作用...
好的,在逐行查看 spdlog 代码后,我找到了意外行为的根源。
我一直在使用
spdlog::error(message);
和相关函数来进行日志记录,因为这些不需要创建任何单例或任何东西。
看代码,这些函数总是使用默认记录器,方法spdlog:register_logger没有设置默认记录器(我不知道它是什么确实)。
如果您改用以下代码:
spdlog::set_default_logger(logger);
似乎工作正常。
我觉得问这个问题就像个傻瓜,因为这是我能想到的最微不足道的例子,但它阻碍了我。
我已经实现了一个非常基本的控制台和文件记录器:
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);
结果:相同
唯一一次我似乎更进一步是当我将日志级别设置为 "error" 时,然后如果下一个日志是错误的,它会出现在文件中。文件中没有其他消息出现。
我也一直找不到手动冲洗。我试过使用示例:
spdlog::apply_all([&](std::shared_ptr<spdlog::logger> l) {l->flush(); });
但这似乎没有任何作用...
好的,在逐行查看 spdlog 代码后,我找到了意外行为的根源。
我一直在使用
spdlog::error(message);
和相关函数来进行日志记录,因为这些不需要创建任何单例或任何东西。
看代码,这些函数总是使用默认记录器,方法spdlog:register_logger没有设置默认记录器(我不知道它是什么确实)。
如果您改用以下代码:
spdlog::set_default_logger(logger);
似乎工作正常。