0

我在 C++ 应用程序中使用 spdlog,我在其中创建了一个构建日志池的类,池中的变量内容并不总是相同,因为它是在传递参数指示的函数内部完成的如果您只想在控制台中记录日志,仅在一个文件中或同时在两个文件中。

换句话说,池可以包括控制台的记录器和文件的记录器或两者中的一个。

选项 1:我尝试使用此代码获得此功能,但它无法编译,并且显示错误,指出它不支持 push_back 功能:

    std::shared_ptr<spdlog::logger> MyClass::loggerPull;
    spdlog::sinks_init_list loggerList;
        
    if (logToUse == USE_CONSOLE)
      loggerList.push_back(myConsoleLog);
    else if (logToUse == USE_FILE)
      loggerList.push_back(myFileLog);
    else
    {
      loggerList.push_back(myConsoleLog);
      loggerList.push_back(myFileLog);
    }

    loggerPull = std::make_shared<spdlog::async_logger>("mylogger", loggerList.begin(), loggerList.end(), spdlog::thread_pool(), spdlog::async_overflow_policy::block);

选项 2:此代码编译并工作:

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

    if (logToUse == LOG_TO_CONSOLE)
    {
      spdlog::sinks_init_list loggerList = { myConsoleLog };
      loggerPull = std::make_shared<spdlog::async_logger>("mylogger", loggerList.begin(), loggerList.end(), spdlog::thread_pool(), spdlog::async_overflow_policy::block);
    }
    else if (logToUse == LOG_TO_FILE)
    {
      spdlog::sinks_init_list loggerList = { myFileLog };
      loggerPull = std::make_shared<spdlog::async_logger>("mylogger", loggerList.begin(), loggerList.end(), spdlog::thread_pool(), spdlog::async_overflow_policy::block);
    }
    else
    {
      spdlog::sinks_init_list loggerList = { myConsoleLog, myFileLog };
      loggerPull = std::make_shared<spdlog::async_logger>("mylogger", loggerList.begin(), loggerList.end(), spdlog::thread_pool(), spdlog::async_overflow_policy::block);
    }

但是,我想在“if ... else if ...”之外定义 loggerList 并使用类似于 push_back 或 instert 的一些函数来将必要的记录器添加到列表中,类似于选项 1 中所做的。

spdlog 中是否有一个函数允许将记录器添加到空的 loggerList 列表中,而不是在 loggerList 的声明中创建和填充列表?

4

0 回答 0