#include <thread>
#include <stdlib.h>
#include <iostream>
#include "spdlog/spdlog.h"
#include "spdlog/sinks/stdout_color_sinks.h"
#include "spdlog/sinks/basic_file_sink.h"
#include "spdlog/sinks/rotating_file_sink.h"
#include "spdlog/sinks/daily_file_sink.h"
#include "spdlog/details/registry.h"
using thread = std::thread;
//1、可以在init函数中实例化多个线程安全logger,spdlog内部自动注册logger到内存中保存,后续通过logger名get到,再使用
//2、stdout_color_mt、stdout_color_st。(xx_mt:线程安全; xx_st:线程不安全)
void stdout_init()
{
// create color multi threaded logger
// 1、stdout流logger
spdlog::stdout_color_mt("console_logger");
//2、std_err流logger
spdlog::stderr_color_mt("stderr_logger");
//3、普通文件流logger
try
{
spdlog::basic_logger_mt("basic_logger", "logs/basic-log.log");
}
catch (const spdlog::spdlog_ex& ex)
{
std::cout << "Log init failed: " << ex.what() << std::endl;
}
//4、设置日志文件最大为5MB, 最多保存3个
spdlog::rotating_logger_mt("ratating_logger", "logs/rotating.log", 1048576 * 5, 3);
//5、每天凌晨2点30分创建一个文件,流重定向到新的文件
spdlog::daily_logger_mt("daily_logger", "logs/daily.log", 2, 30);
//6、带有多个接收器的logger
//stdout标准输出流接收器
auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
console_sink->set_level(spdlog::level::warn);
console_sink->set_pattern("%Y-%m-%d %H:%M:%S [multi_sink_logger] [%^%l%$] %v");
//文件流接收器
auto file_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("logs/multisink.log", true);
file_sink->set_level(spdlog::level::trace);
//多输出流logger实例使用智能指针接受,用于后续注册使用;
auto multi_sink_logger = std::shared_ptr<spdlog::logger>(new spdlog::logger("multi_sink_logger", { console_sink, file_sink }));
multi_sink_logger->set_level(spdlog::level::debug);
multi_sink_logger->error("nihao");
//需要注册,后续才能使用spdlog::get获取到。
spdlog::details::registry::instance().initialize_logger(multi_sink_logger);
//auto logger = spdlog::create("multi_sink_logger", { console_sink, file_sink });
}
void func1()
{
auto logger = spdlog::get("console_logger");
if (NULL == logger)
{
std::cout << "get logger error." << std::endl;
}
int i = 0;
while (i < 10)
{
logger->info("this is thread 1.");
Sleep(2000);
i++;
}
}
void func2()
{
auto logger = spdlog::get("stderr_logger");
if (NULL == logger)
{
std::cout << "get logger error." << std::endl;
}
int i = 0;
while (i < 10)
{
logger->info("this is thread 2.");
Sleep(1000);
i++;
}
}
void func3()
{
auto logger = spdlog::get("multi_sink_logger");
if (NULL == logger)
{
std::cout << "get multi_sink_logger logger error." << std::endl;
}
int i = 0;
while (i < 10)
{
logger->info("this is thread 3.");
Sleep(1000);
i++;
}
}
int main()
{
stdout_init();
thread t1(func1);
thread t2(func2);
thread t3(func3);
t1.join(); // 必须将线程join或者detach 等待子线程结束主进程才可以退出
t2.join();
t3.join();
return 0;
}
spdlog日志简单使用
最新推荐文章于 2024-08-02 17:56:54 发布