爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      【C++】spdlog--log4cxx有点笨重,试一试spdlog

      首页 知识中心 软件开发 文章详情页

      【C++】spdlog--log4cxx有点笨重,试一试spdlog

      2025-02-17 09:20:29 阅读次数:15

      com,github,https,控制台,文件,日志

      spdlog是什么

      Fast C++ logging library
      按照官方介绍,是一个高性能的C++日志组件,支持跨平台,兼容 C++11。原来项目中使用的是log4cxx,我感觉稍微有点笨重,并且很久没有更新了。

      在新项目中,我只需要一款轻量级的日志组件,能:

      • 存文件
      • 按照天数切分

      快速的浏览了spdlog,满足我的需求,于是开搞!

      spdlog快速入门

      编译

      $ git clone https:///gabime/spdlog.git
      $ cd spdlog && mkdir build && cd build
      $ cmake .. && make -j
      

      PS:使用cmake来编译,cmake 命令会生成makefile。如果机器上没有cmake,请先安装一下,我的cmake3.14.5,macos 10.15,

      meki-mac-pro:~ xuyc$ cmake -version
      cmake version 3.14.5
      
      CMake suite maintained and supported by Kitware (/cmake).
      

      使用

      #include "spdlog/spdlog.h"
      #include "spdlog/sinks/basic_file_sink.h"
      
      int main() 
      {
          spdlog::info("Welcome to spdlog!");
          spdlog::error("Some error message with arg: {}", 1);
          
          spdlog::warn("Easy padding in numbers like {:08d}", 12);
          spdlog::critical("Support for int: {0:d};  hex: {0:x};  oct: {0:o}; bin: {0:b}", 42);
          spdlog::info("Support for floats {:03.2f}", 1.23456);
          spdlog::info("Positional args are {1} {0}..", "too", "supported");
          spdlog::info("{:<30}", "left aligned");
          
          spdlog::set_level(spdlog::level::debug); // Set global log level to debug
          spdlog::debug("This message should be displayed..");    
          
          // change log pattern
          spdlog::set_pattern("[%H:%M:%S %z] [%n] [%^---%L---%$] [thread %t] %v");
          
          // Compile time log levels
          // define SPDLOG_ACTIVE_LEVEL to desired level
          SPDLOG_TRACE("Some trace message with param {}", 42);
          SPDLOG_DEBUG("Some debug message");
          
          // Set the default logger to file logger
          auto file_logger = spdlog::basic_logger_mt("basic_logger", "logs/basic.txt");
          spdlog::set_default_logger(file_logger);            
      }
      

      官方的代码大概知道怎么使用spdlog了,点个赞。但是可能会遇到一些问题,下面笔者遇到问题的记录。

      常见问题

      打印行号

      // 先设置日志输出格式
      // %s:文件名,my_file.cpp
      // %#:行号,123
      // %!:函数名,my_func
      spdlog::set_pattern("%Y-%m-%d %H:%M:%S [%l] [%t] - <%s>|<%#>|<%!>,%v");
      
      // 使用宏才会有行号
      SPDLOG_DEBUG("Some debug message");
      
      spdlog::info("Welcome to spdlog!");
      

      推荐写法:

      #define DEBUG(...) SPDLOG_LOGGER_DEBUG(spdlog::default_logger_raw(), __VA_ARGS__)
      #define LOG(...) SPDLOG_LOGGER_INFO(spdlog::default_logger_raw(), __VA_ARGS__)
      #define WARN(...) SPDLOG_LOGGER_WARN(spdlog::default_logger_raw(), __VA_ARGS__)
      #define ERROR(...) SPDLOG_LOGGER_ERROR(spdlog::default_logger_raw(), __VA_ARGS__)
      
      DEBUG("debug");
      LOG("info");
      

      怎么控制台看不到log

      设置默认logger为控制台即可

      // 设置默认logger,这里是控制台,所以spdlog::info的内容会输出到控制台
      auto console = spdlog::stdout_color_mt("console");
      spdlog::set_default_logger(console);
      

      官方代码

      #include "spdlog/spdlog.h"
      #include "spdlog/sinks/stdout_color_sinks.h"
      void stdout_example()
      {
          // create color multi threaded logger
          auto console = spdlog::stdout_color_mt("console");    
          //auto err_logger = spdlog::stderr_color_mt("stderr");    
          spdlog::get("console")->info("loggers can be retrieved from a global registry using the spdlog::get(logger_name)");
      }
      

       

      同时输出控制台和文件

      1. 先注册
      // 每天2:30 am 新建一个日志文件
      auto logger = spdlog::daily_logger_mt("daily_logger", "logs/daily.txt", 2, 30);
      // 遇到warn flush日志,防止丢失
      logger->flush_on(spdlog::level::warn);
      
      1. 通过宏来同时输出console和文件,注意logger名字和上面的对应。
      // spd 带行号的打印,同时输出console和文件
      #define DEBUG(...) SPDLOG_LOGGER_DEBUG(spdlog::default_logger_raw(), __VA_ARGS__);SPDLOG_LOGGER_DEBUG(spdlog::get("daily_logger"), __VA_ARGS__)
      #define LOG(...) SPDLOG_LOGGER_INFO(spdlog::default_logger_raw(), __VA_ARGS__);SPDLOG_LOGGER_INFO(spdlog::get("daily_logger"), __VA_ARGS__)
      #define WARN(...) SPDLOG_LOGGER_WARN(spdlog::default_logger_raw(), __VA_ARGS__);SPDLOG_LOGGER_WARN(spdlog::get("daily_logger"), __VA_ARGS__)
      #define ERROR(...) SPDLOG_LOGGER_ERROR(spdlog::default_logger_raw(), __VA_ARGS__);SPDLOG_LOGGER_ERROR(spdlog::get("daily_logger"), __VA_ARGS__)
      

      文件按天分割

      #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 logger = spdlog::daily_logger_mt("daily_logger", "logs/daily.txt", 2, 30);
      }
      

       

      停止调试log没有写文件?

      spdlog为了提高性能,降低对磁盘的写操作,通过flush机制来一次性把日志写入到文件里面持久化。所以如果没有恰当的配置,停止调试或者进程崩溃的时候会有日志丢失的问题。

      定时flush到文件:

      //每三秒刷新一次
      spdlog::flush_every(std::chrono::seconds(3));
      

       

      遇到error级别,立即flush到文件:

      enum level_enum
      {
          trace = SPDLOG_LEVEL_TRACE, // 最低
          debug = SPDLOG_LEVEL_DEBUG,
          info = SPDLOG_LEVEL_INFO,
          warn = SPDLOG_LEVEL_WARN,
          err = SPDLOG_LEVEL_ERROR,
          critical = SPDLOG_LEVEL_CRITICAL, // 最高
          off = SPDLOG_LEVEL_OFF,
          n_levels
      };
      
      auto logger = spdlog::daily_logger_mt("daily_logger", "log/daily.txt", 2, 30);
      // 遇到warn或者更高级别,比如err,critical 立即flush日志,防止丢失
      logger->flush_on(spdlog::level::warn);
      

      完整代码

      // spdlog
      #include "spdlog/spdlog.h"
      #include "spdlog/sinks/rotating_file_sink.h"
      #include "spdlog/sinks/daily_file_sink.h"
      #include "spdlog/sinks/stdout_color_sinks.h"
      #include <iostream>
      #include <memory>
      
      // spd 带行号的打印,同时输出console和文件
      #define DEBUG(...) SPDLOG_LOGGER_DEBUG(spdlog::default_logger_raw(), __VA_ARGS__);SPDLOG_LOGGER_DEBUG(spdlog::get("daily_logger"), __VA_ARGS__)
      #define LOG(...) SPDLOG_LOGGER_INFO(spdlog::default_logger_raw(), __VA_ARGS__);SPDLOG_LOGGER_INFO(spdlog::get("daily_logger"), __VA_ARGS__)
      #define WARN(...) SPDLOG_LOGGER_WARN(spdlog::default_logger_raw(), __VA_ARGS__);SPDLOG_LOGGER_WARN(spdlog::get("daily_logger"), __VA_ARGS__)
      #define ERROR(...) SPDLOG_LOGGER_ERROR(spdlog::default_logger_raw(), __VA_ARGS__);SPDLOG_LOGGER_ERROR(spdlog::get("daily_logger"), __VA_ARGS__)
      
      int main(int argc, char *argv[]) {
          // 按文件大小
          //auto file_logger = spdlog::rotating_logger_mt("file_log", "log/log.log", 1024 * 1024 * 100, 3);
          // 每天2:30 am 新建一个日志文件
          auto logger = spdlog::daily_logger_mt("daily_logger", "logs/daily.txt", 2, 30);
          // 遇到warn flush日志,防止丢失
          logger->flush_on(spdlog::level::warn);
          //每三秒刷新一次
          spdlog::flush_every(std::chrono::seconds(3));
          
          // Set the default logger to file logger
          auto console = spdlog::stdout_color_mt("console");
          spdlog::set_default_logger(console);
          spdlog::set_level(spdlog::level::debug); // Set global log level to debug
      
          // change log pattern
          // %s:文件名
          // %#:行号
          // %!:函数名
          spdlog::set_pattern("%Y-%m-%d %H:%M:%S [%l] [%t] - <%s>|<%#>|<%!>,%v");
      
          LOG("test info");
          ERROR("test error");
          
          // Release and close all loggers
          spdlog::drop_all();
      }
      

       

      控制台输出

      /Users/xuyc/repo/sd_linux/cmake-build-debug/sd_linux
      [2020-04-30 16:14:41.816] [console] [info] [main.cpp:608] test info
      [2020-04-30 16:14:41.816] [console] [error] [main.cpp:609] test error
      
      Process finished with exit code 0
      

      文件
      【C++】spdlog--log4cxx有点笨重,试一试spdlog

      附录

      网上说只需要头文件即可,不过我还是链接了。。。

      CMakeList.txt

      cmake_minimum_required(VERSION 3.15)
      project(sd_linux)
      
      set(CMAKE_CXX_STANDARD 14)
      AUX_SOURCE_DIRECTORY(./ SRC_LIST)
      AUX_SOURCE_DIRECTORY(./jsoncpp SRC_LIST)
      
      // 包含spdlog的头文件
      INCLUDE_DIRECTORIES(./jsoncpp ./spdlog/include)
      // 包含spdlog的动态库目录
      LINK_DIRECTORIES(./ ./spdlog/build)
      
      add_executable(sd_linux ${SRC_LIST})
      
      // 链接spdlog动态库
      TARGET_LINK_LIBRARIES(sd_linux curl iconv spdlog)
      
      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.csdn.net/bandaoyu/article/details/110730431,作者:bandaoyu,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:【C++贪心】2522. 将字符串分割成值不超过 K 的子字符串|1604

      下一篇:C++算法:2612最少翻转操作数

      相关文章

      2025-05-19 09:05:01

      项目更新到公网服务器的操作步骤

      项目更新到公网服务器的操作步骤

      2025-05-19 09:05:01
      公网 , 数据库 , 文件 , 更新 , 服务器
      2025-05-19 09:05:01

      【Linux】HDP集群日志配置和日志删除脚本

      HDP 集群 默认安装的,日志放在数据盘,但是 namenode和snamenode的数据盘本身不大只有 500G,在不经意间 数据盘被日志装满,首先从集群配置着手。

      2025-05-19 09:05:01
      log4j , 日志 , 集群
      2025-05-19 09:04:38

      js本地上传图片后实现预览与删除功能

      js本地上传图片后实现预览与删除功能

      2025-05-19 09:04:38
      js , 上传 , 删除 , 文件
      2025-05-19 09:04:38

      DataGuard GAP 修复3-- 归档日志不存在

      DataGuard GAP 修复3-- 归档日志不存在

      2025-05-19 09:04:38
      归档 , 日志
      2025-05-19 09:04:30

      判断dmp文件的导出方式是exp or expdp

      判断dmp文件的导出方式是exp or expdp

      2025-05-19 09:04:30
      expdp , 导出 , 文件
      2025-05-16 09:15:17

      Linux系统基础-文件系统

      Linux系统基础-文件系统

      2025-05-16 09:15:17
      hello , 写入 , 文件 , 输出
      2025-05-14 10:33:25

      webpack5基础--01_基本使用

      webpack5基础--01_基本使用

      2025-05-14 10:33:25
      json , main , package , Webpack , 打包 , 文件 , 编译
      2025-05-14 10:33:25

      webpack5基础--02_基本配置( 5 大核心概念)

      webpack5基础--02_基本配置( 5 大核心概念)

      2025-05-14 10:33:25
      config , loader , webpack , Webpack , 文件 , 模式 , 配置文件
      2025-05-14 10:33:16

      30天拿下Python之文件操作

      Python是一种高级编程语言,它提供了许多内置函数和模块来处理文件操作,主要包括:打开文件、读取文件、写入文件、关闭文件、获取目录列表等。

      2025-05-14 10:33:16
      Python , 使用 , 函数 , 文件 , 权限 , 目录
      2025-05-14 10:07:38

      30天拿下Rust之箱、包和模块

      Rust语言使用模块系统来组织工程和代码。模块系统允许我们将相关的函数、类型、常量等组织在一起,形成一个逻辑上的单元。通过模块系统,我们可以隐藏实现细节,只暴露必要的接口,从而提高代码的可读性和可维护性。

      2025-05-14 10:07:38
      Rust , 关键字 , 文件 , 模块 , 访问
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5253122

      查看更多

      最新文章

      30天拿下Python之文件操作

      2025-05-14 10:33:16

      30天拿下Python之模块和包

      2025-05-14 10:03:05

      python中怎样指定open编码为ansi

      2025-05-14 09:51:15

      JS学习(基础语法)

      2025-05-13 09:49:12

      C#目录文件监控

      2025-05-12 08:40:18

      RestTemplate请求UnknownContentTypeException:no suitable HttpMessageConverter异常

      2025-05-09 08:51:09

      查看更多

      热门文章

      SpringBoot 单元测试(三十六)

      2024-09-25 10:14:09

      ActiveRecord语言实现PHP、Python、Node.js

      2023-02-20 07:08:36

      Python编程:trio模块异步/等待本地I/O库

      2024-09-24 06:30:51

      Python爬虫基础——06-文件的读写

      2023-05-09 06:05:41

      前端可视化:Fabric.js HTML5 canvas 工具库

      2023-02-23 07:38:36

      Python 文件读写的问题

      2023-04-24 11:24:27

      查看更多

      热门标签

      java Java python 编程开发 代码 开发语言 算法 线程 Python html 数组 C++ 元素 javascript c++
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      【java文件流处理】

      Python 代码混淆和加密技术

      Java后端日志系统构建:Logback与Log4j2的比较与选择

      用多种编程语言绘制爱心图案的艺术

      Java 属性文件乱码问题

      在Spring Boot项目中logback记录日志出现java.lang.IllegalStateException错误

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号