首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spdlog:未能刷新/写入文件

spdlog:未能刷新/写入文件
EN

Stack Overflow用户
提问于 2018-11-23 12:21:32
回答 1查看 7.4K关注 0票数 2

我觉得自己像个傻瓜,问这个问题,因为它是我能想到的最微不足道的例子,但它却在支撑着我。

我实现了一个非常基本的控制台和文件记录器:

代码语言:javascript
复制
    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::刷新。

我最初用两个接收器(一个控制台,一个文件)实现了这一点,并且有一个类似的问题:除非在这种情况下,它会向日志文件写入第一条(也是第一条)消息,只要它是错误的。

我很抱歉问了这么多的问题.

尝试1(来自多接收器示例):

代码语言:javascript
复制
    // 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(来自基本示例):

代码语言:javascript
复制
    // 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“时,我才能进一步了解它,然后如果下一个日志是一个错误,它就会出现在文件中。文件中没有出现其他消息。

我也找不到手动冲洗。我试过使用这个例子:

代码语言:javascript
复制
spdlog::apply_all([&](std::shared_ptr<spdlog::logger> l) {l->flush(); });

但这看起来没什么用..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-04 16:10:21

好的,在逐行查看spdlog代码之后,我找到了意外行为的来源。

我一直在用

代码语言:javascript
复制
spdlog::error(message);

以及执行日志记录的相关函数,因为这些函数不需要创建任何单点或任何内容。

查看代码,这些函数总是使用默认的记录器,而spdlog:register_logger方法不设置默认的记录器(我不知道它做了什么)。

如果您使用以下代码代替:

代码语言:javascript
复制
spdlog::set_default_logger(logger);

好像没问题。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53446647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档