1

我在我的库中使用 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_loggerwith level也debug保存info日志,但不保存。loggerdebug

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

4

2 回答 2

1

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

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

这样,当您在发布模式下构建时,记录器将只记录info消息,而在发布模式下它将同时记录 infodebug

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

编辑:

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

于 2018-03-13T15:19:05.260 回答
1

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

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

可以通过以下方式更改记录器的刷新策略

logger->flush_on(spdlog::level::info);
于 2018-03-13T17:10:49.670 回答