目录
1.问题
由于spdlog是仅包含头文件的库,因此构建共享库并在主程序中使用它将不会在它们之间共享日志记录器注册表。这意味着对诸如spdlog::set_level(spdlog::level::level_enum::info)之类的函数的调用将不会更改DLL中的记录器。
2.解决方法
可以做的是在两个注册表中都注册记录器。
/*
* Disclaimer:
* This was not compiled but extracted from documentation and some code.
*/
// mylibrary.h
// // 在库中,我们跳过了符号导出部分
#include <memory>
#include <vector>
#include <spdlog/spdlog.h>
#include <spdlog/logger.h>
#include <spdlog/sinks/stdout_color_sinks.h>
namespace library
{
static const std::string logger_name = "example";
std::shared_ptr<spdlog::logger> setup_logger(std::vector<spdlog::sink_ptr> sinks)
{
auto logger = spdlog::get(logger_name);
if(not logger)
{
if(sinks.size() > 0)
{
logger = std::make_shared<spdlog::logger>(logger_name,
std::begin(sinks),
std::end(sinks));
spdlog::register_logger(logger);
}
else
{
logger = spdlog::stdout_color_mt(logger_name);
}
}
return logger;
}
void test(std::string message)
{
auto logger = spdlog::get(logger_name);
if(logger)
{
logger->debug("{}::{}", __FUNCTION__, message);
}
}
}
// In the main program
#include <mylibrary.h>
#include <spdlog/logger.h>
#include <spdlog/sinks/daily_file_sink.h>
#include <spdlog/sinks/stdout_sinks.h>
int main()
{
// We assume that we load the library here
...
// Let's use the library
std::vector<spdlog::sink_ptr> sinks;
sinks.push_back(std::make_shared<spdlog::sinks::stdout_sink_st>());
sinks.push_back(std::make_shared<spdlog::sinks::daily_file_sink_st>("logfile", 23, 59));
auto logger = library::setup_logger(sinks);
spdlog::set_level(spdlog::level::level_enum::debug); // No effect for the library.
library::test("Hello World!"); // No logging
spdlog::register_logger(logger);
// Now this will also affect the library logger
spdlog::set_level(spdlog::level::level_enum::debug);
library::test("Hello World!"); // Hurray !
return 0;
}