Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >spdlog使用示例「建议收藏」

spdlog使用示例「建议收藏」

作者头像
全栈程序员站长
发布于 2022-09-10 05:42:40
发布于 2022-09-10 05:42:40
1.8K00
代码可运行
举报
运行总次数:0
代码可运行

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//
// Copyright(c) 2015 Gabi Melman.
// Distributed under the MIT License (http://opensource.org/licenses/MIT)

// spdlog usage example
/* 参考文献 https://blog.csdn.net/haojie_superstar/article/details/89383433?ops_request_misc=&request_id=&biz_id=102&utm_source=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0 要创建线程安全的loggers,使用带 _mt 后缀的工厂函数,例如: auto logger = spdlog::basic_logger_mt(...); 要创建单线程的loggers,使用带 _st 后缀的工厂函数,例如: auto logger = spdlog::basic_logger_st(...); 对于sinks,以 _mt 后缀结尾的是线程安全的,比如:daily_file_sink_mt 以_st 后缀结尾的是非线程安全的,比如:daily_file_sink_st */

#include <cstdio>

void stdout_logger_example();
void basic_example();
void rotating_example();
void daily_example();
void async_example();
void binary_example();
void trace_example();
void multi_sink_example();
void user_defined_example();
void err_handler_example();
void syslog_example();

#include "spdlog/spdlog.h"

int main(int, char *[])
{ 
   
    //首先你可以使用set_level函数来设置当前的日志等级,所有的等级如下(从大到小):
	//critical(致命错误) err(错误) warn(警告) info(信息) debug(调试) trace(跟踪)
	//最后显示出来的信息只会是你指定等级及其左边的等级日志,比如将等级设置为warn:
    spdlog::info("Welcome to spdlog version {}.{}.{} !", SPDLOG_VER_MAJOR, SPDLOG_VER_MINOR, SPDLOG_VER_PATCH);
    //占位符,长度为8
    spdlog::warn("Easy padding in numbers like {:08d}", 12);
    //10进制,16进制,oct 8进制,2进制
    spdlog::critical("Support for int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}", 42);
    
    //输出为1.23
    spdlog::info("Support for floats {:03.2f}", 1.23456);
    //括号里的数字代表后面参数的顺序,
    spdlog::info("Positional args are {1} {0}..", "too", "supported");
    //左对齐,保证30字符宽度
    spdlog::info("{:>8} aligned, {:<8} aligned", "right", "left");

    // Runtime log levels
    //设置日志等级
    spdlog::set_level(spdlog::level::info); // Set global log level to info
    spdlog::debug("This message should not be displayed!");
    spdlog::set_level(spdlog::level::trace); // Set specific logger's log level
    spdlog::debug("This message should be displayed..");

    // Customize msg format for all loggers
    //设置格式
    spdlog::set_pattern("[%H:%M:%S %z] [%^%L%$] [thread %t] %v");
    spdlog::info("This an info message with custom format");
    spdlog::set_pattern("%+"); // back to default format,返回默认格式
    spdlog::set_level(spdlog::level::info);

    // Backtrace support
    // Loggers can store in a ring buffer all messages (including debug/trace) for later inspection.
    // When needed, call dump_backtrace() to see what happened:
    //记录器可以将所有消息(包括调试/跟踪)存储在环形缓冲区中,以供以后检查。
    //需要时,调用dump_backtrace()查看发生了什么:
  
    spdlog::enable_backtrace(10); // create ring buffer with capacity of 10 messages
    for (int i = 0; i < 100; i++)
    { 
   
        spdlog::debug("Backtrace message {}", i); // not logged..
    }
    // e.g. if some error happened:
    spdlog::dump_backtrace(); // log them now!

    try
    { 
   
        stdout_logger_example();
        basic_example();
        rotating_example();
        daily_example();
        async_example();
        binary_example();
        multi_sink_example();
        user_defined_example();
        err_handler_example();
        trace_example();

        // Flush all *registered* loggers using a worker thread every 3 seconds.
        //每隔3秒使用工作线程刷新所有*已注册*的日志记录器。
        // note: registered loggers *must* be thread safe for this to work correctly!
        //注意:注册的记录器*必须*是线程安全的,这样才能正常工作!
        spdlog::flush_every(std::chrono::seconds(3));

        // Apply some function on all registered loggers
        //对所有注册的记录器应用某些功能
        spdlog::apply_all([&](std::shared_ptr<spdlog::logger> l) { 
    l->info("End of example."); });

        // Release all spdlog resources, and drop all loggers in the registry.
        //释放所有spdlog资源,并在注册表中删除所有记录器。
        // This is optional (only mandatory if using windows + async log).
        //这是可选的(仅在使用windows+异步日志时是必需的)。
        spdlog::shutdown();
    }

    // Exceptions will only be thrown upon failed logger or sink construction (not during logging).
    catch (const spdlog::spdlog_ex &ex)
    { 
   
        std::printf("Log initialization failed: %s\n", ex.what());
        return 1;
    }
}

#include "spdlog/sinks/stdout_color_sinks.h"
// or #include "spdlog/sinks/stdout_sinks.h" if no colors needed.
void stdout_logger_example()
{ 
   
    // Create color multi threaded logger.
    //创建彩色多线程记录器。
    auto console = spdlog::stdout_color_mt("console");
    // or for stderr:
    // auto console = spdlog::stderr_color_mt("error-logger");
}

#include "spdlog/sinks/basic_file_sink.h"
void basic_example()
{ 
   
    // Create basic file logger (not rotated).
    //创建基本文件记录器(不旋转)。
    auto my_logger = spdlog::basic_logger_mt("file_logger", "logs/basic-log.txt");
}

#include "spdlog/sinks/rotating_file_sink.h"
void rotating_example()
{ 
   
    // Create a file rotating logger with 5mb size max and 3 rotated files.
    //创建一个最大大小为5mb的文件滚动记录器和3个滚动文件。
    auto rotating_logger = spdlog::rotating_logger_mt("some_logger_name", "logs/rotating.txt", 1048576 * 5, 3);
}

#include "spdlog/sinks/daily_file_sink.h"
void daily_example()
{ 
   
    // Create a daily logger - a new file is created every day on 2:30am.
    auto daily_logger = spdlog::daily_logger_mt("daily_logger", "logs/daily.txt", 2, 30);
}

//使用工厂函数创建异步logger:
#include "spdlog/async.h"
void async_example()
{ 
   
    // Default thread pool settings can be modified *before* creating the async logger:
    //在*创建异步记录器之前*可以修改默认线程池设置:
    // spdlog::init_thread_pool(32768, 1); // queue with max 32k items 1 backing thread.
    //使用最多32k个项目1的后台线程排队。
    auto async_file = spdlog::basic_logger_mt<spdlog::async_factory>("async_file_logger", "logs/async_log.txt");
    // alternatively:
    // auto async_file = spdlog::create_async<spdlog::sinks::basic_file_sink_mt>("async_file_logger", "logs/async_log.txt");

    for (int i = 1; i < 101; ++i)
    { 
   
        async_file->info("Async message #{}", i);
    }
}

// Log binary data as hex.
// Many types of std::container<char> types can be used.
// Iterator ranges are supported too.
// Format flags:
// {:X} - print in uppercase.用大写印刷。
// {:s} - don't separate each byte with space.不要用空格分隔每个字节。
// {:p} - don't print the position on each line start.不要在每行开始处打印位置。
// {:n} - don't split the output to lines.不要将输出拆分为行。

#include "spdlog/fmt/bin_to_hex.h"
void binary_example()
{ 
   
    std::vector<char> buf(80);
    for (int i = 0; i < 80; i++)
    { 
   
        buf.push_back(static_cast<char>(i & 0xff));
    }
    spdlog::info("Binary example: {}", spdlog::to_hex(buf));
    spdlog::info("Another binary example:{:n}", spdlog::to_hex(std::begin(buf), std::begin(buf) + 10));
    // more examples:
    // logger->info("uppercase: {:X}", spdlog::to_hex(buf));
    // logger->info("uppercase, no delimiters: {:Xs}", spdlog::to_hex(buf));
    // logger->info("uppercase, no delimiters, no position info: {:Xsp}", spdlog::to_hex(buf));
}

// Compile time log levels.日志宏定义
// #define SPDLOG_ACTIVE_LEVEL to required level (e.g. SPDLOG_LEVEL_TRACE)
void trace_example()
{ 
   
    // trace from default logger
    SPDLOG_TRACE("Some trace message.. {} ,{}", 1, 3.23);
    // debug from default logger
    SPDLOG_DEBUG("Some debug message.. {} ,{}", 1, 3.23);

    // trace from logger object
    auto logger = spdlog::get("file_logger");
    SPDLOG_LOGGER_TRACE(logger, "another trace message");
}

// A logger with multiple sinks (stdout and file) - each with a different format and log level.
//创建一个对应多个sink的logger,每一个sink都有独有的格式和日志级别
void multi_sink_example()
{ 
   
    auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
    console_sink->set_level(spdlog::level::warn);
    console_sink->set_pattern("[multi_sink_example] [%^%l%$] %v");

    auto file_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("logs/multisink.txt", true);
    file_sink->set_level(spdlog::level::trace);

    spdlog::logger logger("multi_sink", { 
   console_sink, file_sink});
    logger.set_level(spdlog::level::debug);
    logger.warn("this should appear in both console and file");
    logger.info("this message should not appear in the console, only in the file");
}

//创建一个由多个loggers共享同一个输出文件的sink
#include <iostream>
#include "spdlog/spdlog.h"
#include "spdlog/sinks/daily_file_sink.h"
int main(int, char* [])
{ 
   
    try
    { 
   
        auto daily_sink = std::make_shared<spdlog::sinks::daily_file_sink_mt>("logfile", 23, 59);
        // create synchronous loggers
        auto net_logger = std::make_shared<spdlog::logger>("net", daily_sink);
        auto hw_logger  = std::make_shared<spdlog::logger>("hw",  daily_sink);
        auto db_logger  = std::make_shared<spdlog::logger>("db",  daily_sink);      

        net_logger->set_level(spdlog::level::critical); // independent levels
        hw_logger->set_level(spdlog::level::debug);
         
        // globally register the loggers so so the can be accessed using spdlog::get(logger_name)
        spdlog::register_logger(net_logger);
    }
    catch (const spdlog::spdlog_ex& ex)
    { 
   
        std::cout << "Log initialization failed: " << ex.what() << std::endl;
    }
}

// User defined types logging by implementing operator<<
#include "spdlog/fmt/ostr.h" // must be included
struct my_type
{ 
   
    int i;
    template<typename OStream>
    friend OStream &operator<<(OStream &os, const my_type &c)
    { 
   
        return os << "[my_type i=" << c.i << "]";
    }
};

void user_defined_example()
{ 
   
    spdlog::info("user defined type: {}", my_type{ 
   14});
}

// Custom error handler. Will be triggered on log failure.
void err_handler_example()
{ 
   
    // can be set globally or per logger(logger->set_error_handler(..))
    spdlog::set_error_handler([](const std::string &msg) { 
    printf("*** Custom log error handler: %s ***\n", msg.c_str()); });
}

// syslog example (linux/osx/freebsd)
#ifndef _WIN32
#include "spdlog/sinks/syslog_sink.h"
void syslog_example()
{ 
   
    std::string ident = "spdlog-example";
    auto syslog_logger = spdlog::syslog_logger_mt("syslog", ident, LOG_PID);
    syslog_logger->warn("This is warning that will end up in syslog.");
}
#endif

// Android example.
#if defined(__ANDROID__)
#include "spdlog/sinks/android_sink.h"
void android_example()
{ 
   
    std::string tag = "spdlog-android";
    auto android_logger = spdlog::android_logger_mt("android", tag);
    android_logger->critical("Use \"adb shell logcat\" to view this message.");
}

#endif

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

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
spdlog日志库的使用
今天介绍一个开源日志库,只需要将include下面的文件拷贝到自己的代码目录下,就可以在项目中使用。使用效果如下图所示:
CPP开发前沿
2021/12/16
3.1K0
spdlog日志库的使用
Log:Spdlog初探(1)
Github地址:Github地址 官网介绍:Very fast, header-only/compiled, C++ logging library。轻量,仅有头文件/编译,C++日志库。 注意:Spdlog包含了C++11特性,需使用支持C++11特性的编译器。
全栈程序员站长
2022/09/10
1K0
Log:Spdlog初探(1)
spdlog学习笔记
说明:所有内容翻译自spdlog的wiki,受英语水平所限,有所错误或失真在所难免,如果您有更好的建议,请在博文下留言。
全栈程序员站长
2022/09/10
1.6K0
spdlog使用
参考1:https://www.cnblogs.com/LuckCoder/p/11171609.html
全栈程序员站长
2022/09/10
9180
[C++]-日志记录库SPDLog简介[通俗易懂]
spdlog是基于C++11实现的一款纯头文件的日志管理库(git地址:https://github.com/gabime/spdlog,API说明:https://spdlog.docsforge.com/v1.x/1.quickstart/):
全栈程序员站长
2022/09/10
8.7K1
c++日志库实战——spdlog,是不是感觉log4cxx有点笨重,不妨试一试spdlog
在最近新入职同事的推荐下,作者在一个小工具中学习和使用了spdlog,且已发布到线上运行,以下是学习记录。
全栈程序员站长
2022/09/07
1.7K0
c++日志库实战——spdlog,是不是感觉log4cxx有点笨重,不妨试一试spdlog
spdlog linux编译出错,spdlog「建议收藏」
// console logger (multithreaded and with color)
全栈程序员站长
2022/09/10
1.7K0
log库spdlog简介及使用[通俗易懂]
spdlog是一个开源的、快速的、仅有头文件的C++11 日志库,code地址在 https://github.com/gabime/spdlog ,目前最新的发布版本为0.14.0。它提供了向流、标准输出、文件、系统日志、调试器等目标输出日志的能力。它支持的平台包括Windows、Linux、Mac、Android。
全栈程序员站长
2022/09/10
4.2K0
log库spdlog简介及使用[通俗易懂]
Cpp(十二) log日志基本使用spdlog
Cpp日志spdlog #1 环境 macOS 10.15.5 spdlog #2 需求分析 日志按等级分到不同的文件 日志按时间分割 #3 使用 #3.1 工程结构 . ├── CMakeLists.txt ├── cmake-build-debug ├── include │ └── spdlog ├── log.hpp └── main.cpp #3.2 CMakeLists.txt cmake_minimum_required(VERSION 3.17) project(my_spdlog)
Autooooooo
2021/03/02
4K0
Cpp(十二) log日志基本使用spdlog
开源库推荐——spdlog
在软件开发领域,日志记录是一项至关重要的工作。它不仅是程序运行情况的实时记录者,更是故障排查和系统优化的关键依据。然而,随着项目规模的扩大和复杂性的增加,传统的日志管理方式已经难以满足开发者的需求。这时候,一个高效、灵活的日志库就显得尤为重要。在众多的日志库中spdlog以其出色的性能和便捷的使用方式,赢得了广大开发者的青睐。
程序员的园
2024/07/18
2030
开源库推荐——spdlog
spdlog 个人封装,欢迎使用,共同探讨[通俗易懂]
#ifndef _MY_LOG_HPP_ #define _MY_LOG_HPP_
全栈程序员站长
2022/09/10
1.5K0
c++日志工具推荐--spdlog
spdlog日志是纯头文件,使用起来比较方便。使用时只需要简单的初始化即可,这里对其初始化做了一个简单的封装,这样使用起来更加方便。 输出到console与输出到文件的级别可以分开设置,并支持动态设置。
fensnote
2021/08/26
9160
spdLog的使用
只包含头文件 (spdlog/spdlog.h —> spdlog , spdlog/fmt/bundled/format.h —> pattern_formatter)
全栈程序员站长
2022/09/10
1.9K0
【C++】开源:spdlog跨平台日志库配置使用
项目Github地址:https://github.com/gabime/spdlog
DevFrank
2024/07/24
6220
spdlog 日志库学习,简易封装
spdlog wiki:https://github.com/gabime/spdlog/wiki
全栈程序员站长
2022/09/10
1.3K0
sinkable_paas容器
滚动式日志生成,当一个文件达到约定大小后将创建一个新的log文件继续写入,知道日志文件数目达到用户指定的最大数量。log文件大小和可以在spdlog::rotating_logger_mt构造函数中配置
全栈程序员站长
2022/11/01
8370
spdlog源码学习
spdlog是一个用c++11实现的高性能日志库。 接入方便,功能丰富,代码可读性较高。 ---- Features Very fast - performance is the primary goal Headers only, just copy and use. Feature rich using the excellent fmt library. Extremely fast asynchronous mode (optional) - using lockfree queues an
felix
2018/06/08
2.2K0
【C++ spdlog】C++ 日志库 spdlog 使用
参考: https://github.com/gabime/spdlog https://www.cnblogs.com/oucsheep/p/8426548.html https://blog.csdn.net/yanxiaobugyunsan/article/details/79088533
全栈程序员站长
2022/09/10
1.6K0
【C++ spdlog】C++ 日志库 spdlog 使用
spdlog开源库使用
spdlog是一个非常简单快速的日志库。到现在为止仅仅简单尝试了一下,使用体验比较满意。这里推荐一下。下面是开源库的源地址:源地址
全栈程序员站长
2022/09/10
5170
日志管理的重要性及实践
日志管理是任何IT系统管理的重要组成部分。它可以帮助我们理解系统的运行状态,发现并解决问题,以及进行安全审计。对于C++开发的系统而言,良好的日志管理实践同样至关重要。本文将详细介绍日志管理的具体步骤、注意事项,并结合C++实例,推荐一些查看日志的好用工具。
码事漫谈
2025/01/18
960
日志管理的重要性及实践
相关推荐
spdlog日志库的使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验