前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >spdLog的使用

spdLog的使用

作者头像
全栈程序员站长
发布2022-09-10 09:54:05
1.5K0
发布2022-09-10 09:54:05
举报

大家好,又见面了,我是你们的朋友全栈君。

以下为收集到或者个人测试的内容,侵权删

一.优点

只包含头文件 (spdlog/spdlog.h —> spdlog , spdlog/fmt/bundled/format.h —> pattern_formatter)

无需依赖第三方库

支持跨平台 – Linux / Windows on 32/64 bits

可每日生成日志文件 daily_file_sink 每天定时产生文件日志

支持控制台日志输出

可选的异步日志

支持日志输出级别

可自定义日志格式

二.基本使用

1.直接打印日志到console

auto console1 = spd::stdout_logger_mt("console1"); console1->error("Some error message with arg{}..", 1); //console2 的module 名字不可以和以前的重复,创建的日志名字为 basic_log auto console2 = spd::basic_logger_mt("basic_logger","./basic_log"); console2->info("Some log message"); //通过module名字获取到对应的log指针 spd::get("console2")->info("get console by name"); //设置日志等级 spd::set_level(spd::level::info);//Set global log level to info console1->debug("This message shold not be displayed!"); console1->set_level(spd::level::debug);// Set specific logger's log level console1->debug("This message shold be displayed..");

2.每天更新一个log文件(带秒数)

//创建文件名类似于: daily_log_2018-01-17_10-27.txt,如果程序不退出的话,就是每天2:30 am创建新的文件 auto console3 = spd::daily_logger_mt("daily_logger","./daily_log", 2, 30); console3->flush_on(spd::level::debug); console3->info("test daily info"); console3->error("test daily error")

如果想在文件名里只关心天数,可以使用这个,这样的好处是,同一天多次运行一个程序,可以把log写到同一个文件里面去,测试了不会覆盖以前的内容

代码语言:javascript
复制
//创建文件名类似于: log_2018-01-17.txt
typedefspdlog::sinks::daily_file_sink<std::mutex, spdlog::sinks::dateonly_daily_file_name_calculator> dateonly_daily_file_sink_mt;
auto m_logger = spdlog::create<dateonly_daily_file_sink_mt>("logger","log","txt", 0, 0);
m_logger->info("test daily info");
m_logger->error("test daily error");

3.日志太多的时候,当前文件重命名_1,_2,_3.再写新的文件

代码语言:javascript
复制
//日志文件名为
//-rw-rw-r-- 1 ski ski    962 Jan 17 10:48 mylogfile_log.1.txt
//-rw-rw-r-- 1 ski ski    962 Jan 17 10:48 mylogfile_log.2.txt
//-rw-rw-r-- 1 ski ski    962 Jan 17 10:48 mylogfile_log.3.txt
//-rw-rw-r-- 1 ski ski    370 Jan 17 10:48 mylogfile_log.txt
 
auto rotating_logger = spd::rotating_logger_mt("rotate_log","./mylogfile_log", 1024, 3);
for (int i = 0; i < 1000; ++i)
    rotating_logger->info("{} * {} equals {:>10}", i, i, i*i);

4.flush_on命令

代码语言:javascript
复制
//遇到错误及以上级别会立马将缓存的buffer写到文件中,底层调用是std::fflush(_fd)
m_logger->flush_on(spd::level::err);

5.关闭所有的log handler

// Release and close all loggers 把所有的log对象智能指针放置到unordered_map中去,然后调用clear函数 spdlog::drop_all();

三.源码阅读

spdlog支持多线程的,想看看其中是怎么控制同步的,实现多线程的一个接口:

代码语言:javascript
复制
auto rotating_logger = spd::rotating_logger_mt("some_logger_name", "logs/rotating.txt", 1048576 * 5, 3);

点进去:

代码语言:javascript
复制
inline std::shared_ptr<spdlog::logger> spdlog::rotating_logger_mt(const std::string& logger_name, const filename_t& filename, size_t max_file_size, size_t max_files)
{
    return create<spdlog::sinks::rotating_file_sink_mt>(logger_name, filename, max_file_size, max_files);
}

继续:

代码语言:javascript
复制
typedef rotating_file_sink<std::mutex> rotating_file_sink_mt;
typedef rotating_file_sink<details::null_mutex>rotating_file_sink_st;

所有的sinks类都是继承sinks类的,这里是从rotating_file_sink->base_sink->sink继承而来的。

代码语言:javascript
复制
template<class Mutex>
代码语言:javascript
复制
class rotating_file_sink SPDLOG_FINAL : public base_sink < Mutex >

看看base_sinks类中的两个关键log函数:

代码语言:javascript
复制
template<class Mutex>
class base_sink:public sink
{
    void log(const details::log_msg& msg) SPDLOG_FINAL override
    {
        std::lock_guard<Mutex> lock(_mutex);
        _sink_it(msg);
    }
    void flush() SPDLOG_FINAL override
    {
        std::lock_guard<Mutex> lock(_mutex);
        _flush();
    }
代码语言:javascript
复制
在这里是根据锁的类型不同而实现多线程和单线程的区别,多线程的锁可以使用正常的锁机制来使用,那么,单线程的使用呢? 开始查看details::null_mutex的定义:
代码语言:javascript
复制
struct null_mutex
代码语言:javascript
复制
{
    void lock() {}
    void unlock() {}
    bool try_lock()
    {
        return true;
    }
};

其实,他是使用了一个类去模拟锁的函数,但是里面什么也不做,这样就可以与多线程情况下使用同样的代码了,提升了代码效率。值得借鉴

其他:

参考网址:

1.spdLog官网

2.spdLog源码阅读

主要包括三页内容:

sink介绍(base_sink, rotating_file_sink,另外还有 daily_file_sink)

sink创建和使用(稍微介绍了下单例模式)

log_msg的原理介绍(缓冲区存储日志内容)

3.spdLog使用example

这是spdLog自带的一个example,教你如何使用sink去写log

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/152329.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 以下为收集到或者个人测试的内容,侵权删
  • 一.优点
  • 二.基本使用
    • 1.直接打印日志到console
      • 2.每天更新一个log文件(带秒数)
        • 3.日志太多的时候,当前文件重命名_1,_2,_3.再写新的文件
          • 4.flush_on命令
            • 5.关闭所有的log handler
            • 三.源码阅读
            相关产品与服务
            日志服务
            日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档