spdlog是什么

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

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

  • 存文件
  • 按照天数切分

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

spdlog快速入门

github:https://github.com/gabime/spdlog

以下内容来自spdlog的 README

编译

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

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

meki-mac-pro:~ xuyc$ cmake -version
cmake version 3.14.5CMake suite maintained and supported by Kitware (kitware.com/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 debugspdlog::debug("This message should be displayed..");    // change log patternspdlog::set_pattern("[%H:%M:%S %z] [%n] [%^---%L---%$] [thread %t] %v");// Compile time log levels// define SPDLOG_ACTIVE_LEVEL to desired levelSPDLOG_TRACE("Some trace message with param {}", 42);SPDLOG_DEBUG("Some debug message");// Set the default logger to file loggerauto 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!");

具体见:https://github.com/gabime/spdlog/wiki/3.-Custom-formatting

推荐写法

#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 loggerauto 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:30amauto 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 loggerauto 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 loggersspdlog::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 errorProcess finished with exit code 0

文件

附录

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

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)

关于

推荐下自己的开源IM,纯Golang编写:

CoffeeChat:
https://github.com/xmcy0011/CoffeeChat
opensource im with server(go) and client(flutter+swift)

参考了TeamTalk、瓜子IM等知名项目,包含服务端(go)和客户端(flutter),单聊和机器人(小微、图灵、思知)聊天功能已完成,目前正在研发群聊功能,欢迎对golang和跨平台开发flutter技术感兴趣的小伙伴Star加关注。

原文链接:https://blog.csdn.net/xmcy001122/article/details/105665732

【C++】spdlog--log4cxx有点笨重,试一试spdlog相关推荐

  1. c++日志库实战——spdlog,是不是感觉log4cxx有点笨重,不妨试一试spdlog

    c++日志库实战--spdlog,是不是感觉log4cxx有点笨重,不妨试一试spdlog 背景 更新记录 spdlog是什么 spdlog快速入门 编译 CMake手动方式 Vcpkg全自动方式(推 ...

  2. spdlog linux编译出错,【C++】spdlog--log4cxx有点笨重,试一试spdlog

    spdlog是什么linux Fast C++ logging library 按照官方介绍,是一个高性能的C++日志组件,支持跨平台,兼容 C++11.原来项目中使用的是log4cxx,我感受稍微有 ...

  3. 扛住100亿次请求?我们来试一试!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | xiaojiaqi 来源 | github.com/xi ...

  4. python第七章动手试一试_Python学习3

    第七章 用户输入和while循环 7.1 函数input()的工作原理 动手试一试: carname=input('Please input the car you want to hire:') p ...

  5. AI也能写高考作文?我们用清华刚刚开源的「九歌」试了试

    晓查 郭一璞 发自 凹非寺 量子位 报道 | 公众号 QbitAI 今天是高考第一天,我猜,你一定在看全国各地那些奇奇怪怪的高考作文题,还要纠结一下: 这题目,该怎么写? 那,写不出来不如扔给AI,看 ...

  6. python课本第三章答案idle_第三天任务 (【基于Python编程从入门到实践】第三章 列表 书本及动手试一试)...

    3.1列表什么是列表 列表是由 一系列特定顺序排列的元素组成的 用方括号[]来表示列表 并用逗号来分隔其中的元素 访问列表元素 索引指定访问的列表元素 使用列表中的各个值 3--1 动手试一试 3.1 ...

  7. CSS性能优化:可以试一试内联CSS?

    CSS性能优化:可以试一试内联CSS? 在互联网的早期,网站主要用于显示基于文本的信息.慢慢地,我们的连接速度得到了提高,用户能够相当快地下载高分辨率图像和视频.现在,网站做的不仅仅是以文本形式提供必 ...

  8. 试了试Docker桌面应用自带的K8s集群,一个字“简单”

    前言 之前给大家介绍过几种在笔记本电脑上安装Kubernetes集群的工具,虽然安装起来不太繁琐但是多多少少还是需要花一些时间的,对于不想瞎倒腾,就想快速安装个本地集群开始学习和测试的同学,推荐你们试 ...

  9. ios 获取固件版本_觉得iOS测试版本BUG太多?系统降级试一试?

    对于那些喜欢折腾手机,尝鲜新功能的小伙伴来说,一但iOS有新的测试版本出来就会更新,但iOS 系统的小更新很是频繁,经常更新难免会出问题,尤其是较大版本间的升级(比如iOS12到iOS13),会让很多 ...

最新文章

  1. 【leetcode】3Sum
  2. 网站的domain不在首页的原因
  3. Java多重链表_Java实现 LeetCode 143 重排链表
  4. 当前页面excel导出_系统地学习Excel第03课,Excel的工作界面
  5. Oracle排序查询语句
  6. 蓝桥杯特殊回文数C语言简易版
  7. 游戏音乐制作中,编曲和作曲的区别
  8. AT91SAM9260搭建LINUX操作系统
  9. 同一目录下批处理执行Word宏
  10. 香港银行开户多少钱能开下来
  11. qlv转php,如何将qlv文件转换成mp,qlv文件怎么免费转换为mp4格式
  12. 《C语言点滴》参考文献
  13. JSON是什么,做什么用的
  14. Watir数据驱动 - Excel
  15. java 获取系统的时区_【转】Java 获取操作系统时区
  16. robocode调试技巧
  17. (转)手把手教你写专利申请书•如何申请专利
  18. Live Server 正常启用 但是网页不更新 解决方法
  19. 数据库系统工程师考试历年试题分析与解答
  20. idea 导入 vue项目 improt全都报红

热门文章

  1. Docker概述与安装
  2. Oracle11g新特性密码延迟验证的坑
  3. 信息安全技术——Many Time Pad攻击实验
  4. 生成1至10位随机数
  5. java毕业设计电影公司网Mybatis+系统+数据库+调试部署
  6. 新氧2023年财务业绩预测:退市风险大幅降低,收入增长将放缓
  7. 巨头“围攻”之下,新氧医美能否“破局”?
  8. [论文阅读笔记44]Named Entity Recognition without Labelled Data:A Weak Supervision Approach
  9. Java新手上路--算数运算符
  10. raid10模型比raid01模型的冗余度高