spdlog日志简单使用

#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;
}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值