1. 结构
分为registry、loger、sink三个层次
loger实例化后,调用spdlog::register则会全局注册,之后通过sdplog::get(LOGNAME)则可获取到对应的loger。
sink实例化后,通过loger的构造函数可以将sink注册到loger中,支持多个sink注册到同一个loger中。
- spdlog的默认logger
在spdlog中,如果没有显式声明或注册任何logger,spdlog会自动创建一个名为空的logger,并将其注册为全局默认logger。这个logger将输出到标准输出,并使用默认的日志级别(即info级别)。因此,如果你没有显式声明或注册任何logger,你可以使用以下代码获取默认logger:auto logger = spdlog::get("default");
注意,如果你显式声明或注册了任何logger,那么默认logger将不再自动创建和注册。
- spdlogn哪些接口会自动注册logger
在spdlog中,以下接口会自动注册logger:
-
spdlog::stdout_logger()和spdlog::stderr_logger():这些函数分别返回一个输出到标准输出和标准错误的logger,并使用默认名称"sink"注册该logger。
-
spdlog::basic_logger():这个函数返回一个输出到文件的logger,并使用默认名称"sink"注册该logger。
-
spdlog::rotating_logger()和spdlog::daily_logger():这些函数分别返回一个按文件大小和按日期滚动的logger,并使用默认名称"sink"注册该logger。如果你使用这些函数创建logger,你可以使用spdlog::get函数来获取已经注册的logger。例如,如果你使用spdlog::stdout_logger()函数创建了一个logger,你可以使用以下代码获取该logger:
auto logger = spdlog::get("sink");
注意,如果你使用spdlog::basic_logger()、spdlog::rotating_logger()或spdlog::daily_logger()函数创建logger时指定了名称,那么该logger将使用指定的名称进行注册,而不是默认名称"sink"。
2. 实现跨平台日志
// Android example.
#if defined(__ANDROID__)
#include "spdlog/sinks/android_sink.h"
void set_default()
{
std::string tag = "spdlog-android";
auto android_logger = spdlog::android_logger_mt("android", tag);
android_logger->set_level(spdlog::level::trace);
spdlog::set_default_logger(android_logger);
}
#else
void set_default()
{
}
#endif
int main()
{
set_default();
spdlog::info("Welcome to spdlog!");
return 0;
}
ref: