带有gtest框架的Spdlog记录器无法正常工作

时间:2018-03-13 14:36:47

标签: c++ logging googletest spdlog

我在我的库中使用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

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

2 个答案:

答案 0 :(得分:1)

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

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

这样,当您在发布模式下构建时,记录器将仅记录 info 消息,而在发布模式下,它将记录两者 info debug

您的调试记录器保存 info 日志这一事实并不奇怪。几乎所有的日志库都采用这种方法。它们具有不同的日志记录粒度级别。例如: info 警告 debug 详细。然后,当您将级别设置为警告时,将仅记录警告 info ,而如果您选择例如 verbose ,然后将记录所有类型。

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

答案 1 :(得分:0)

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

在所有测试之后(不是在每个测试用例或每个测试类之后)刷新

info个日志。这就是为什么我的文件总是空的(我杀了进程)。

可以通过

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