带有 gtest 框架的 Spdlog 记录器不工作

Spdlog logger with gtest framework is not working

我在我的库中使用 spdlog 和 gtest。我需要将一些日志(不是 gtest 日志)从测试执行保存到文件。这是创建记录器的代码:

void createLogger() {
    auto debug_logger = spdlog::rotating_logger_mt("debug_logger", "logs/test_debug", 1024 * 1024 * 25, 3);
    debug_logger->set_level(spdlog::level::debug);
    auto logger = spdlog::rotating_logger_mt("logger", "logs/test_info", 1024 * 1024 * 5, 2);
}

它在我的库的示例程序中运行良好。当我 运行 测试时 debug_logger 将所有内容保存在文件中,但 logger 什么也不保存。当我删除

debug_logger->set_level(spdlog::level::debug);

debug_logger 也不起作用。所以我认为这是记录器的问题但是当我添加

logger->set_level(spdlog::level::info);

还是不行。

这里是测试的主要部分:

int main(int argc, char **argv) {
    try {
        utility::createLogger();
        ::testing::InitGoogleTest(&argc, argv);
        return RUN_ALL_TESTS();
     } catch (const spdlog::spdlog_ex& ex) {
         std::cout << "Log initialization failed: " << ex.what() << std::endl;
     }
}

设置和测试用例之一:

class CPUTest: public ::testing::Test {

protected:

std::shared_ptr<spdlog::logger> logger;

void SetUp() {
    spdlog::get("logger")->info("test get");
    logger = spdlog::get("logger");
}
};

TEST_F(CPUTest, Resolve15) {
    logger->info("Something from info logger");
    // ...
}

debug_logger 级别 debug 也会保存 info 日志,但 logger 级别 debug 不会。

你知道我的代码中测试和记录器初始化有什么问题吗?我应该在我的库中使用两个记录器还是一个有两个文件?

不需要两个独立的记录器。这只会使您的逻辑复杂化。您应该有一个记录器,您将根据构建类型为其设置粒度级别。像这样:

#ifdef RELEASE
logger->set_level(spdlog::level::info);
#else
logger->set_level(spdlog::level::debug);
#endif

这样,当您在发布模式下构建时,记录器将仅记录 info 消息,而在发布模式下它将记录 both 信息调试

您的调试记录器也保存 info 日志这一事实并不奇怪。几乎所有的日志库都采用这种方法。它们具有不同的日志记录粒度级别。例如:infowarningdebugverbose .那么当你将级别设置为 warning 时,只有 warninginfo 会被记录,而如果你select 例如 verbose,然后将记录所有类型。

编辑:

如果您确实需要按类型将日志拆分到不同的文件中,您可以使用您喜欢的脚本语言编写一个简单的脚本来执行此操作。我假设这个库中的日志标有它们的类型。您可以使用它来解析输出文件并将特定类型的日志提取到单独的文件中。这很容易做到。拥有两个记录器只会使事情复杂化,并且会导致性能下降,如果您的测试套件变大,这很重要。

由于我的测试执行时间很长,我正在终止进程。 debug 日志始终保存在两个文件中,info 日志没有。这是由 spdlog 中的刷新策略引起的(debug 级别更重要并且经常刷新 - 我想几乎在每次调用之后)。

info 日志在所有测试后刷新(不是在每个测试用例或每个测试后 class)。这就是为什么我的文件总是空的(我终止了进程)。

可以通过

更改记录器的刷新策略
logger->flush_on(spdlog::level::info);