spdlog是什么linux

Fast C++ logging library

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

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

存文件

按照天数切分

快速的浏览了spdlog,知足个人需求,因而开搞!github

spdlog快速入门

如下内容来自spdlog的 READMEmacos

编译json

$ git clone https://github.com/gabime/spdlog.git

$ cd spdlog && mkdir build && cd build

$ cmake .. && make -j

PS:使用cmake来编译,cmake 命令会生成makefile。若是机器上没有cmake,请先安装一下,个人cmake3.14.5,macos 10.15,swift

meki-mac-pro:~ xuyc$ cmake -version

cmake version 3.14.5

CMake suite maintained and supported by Kitware (kitware.com/cmake).

使用bash

#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了,点个赞。可是可能会遇到一些问题,下面笔者遇到问题的记录。curl

常见问题

打印行号

// 先设置日志输出格式

// %s:文件名,my_file.cpp

// %#:行号,123

// %!:函数名,my_func

spdlog::set_pattern("%Y-%m-%d %H:%M:%S [%l] [%t] - ||,%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)");

}

同时输出控制台和文件

先注册

// 天天2:30 am 新建一个日志文件

auto logger = spdlog::daily_logger_mt("daily_logger", "logs/daily.txt", 2, 30);

// 遇到warn flush日志,防止丢失

logger->flush_on(spdlog::level::warn);

经过宏来同时输出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

#include

// 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] - ||,%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

文件

附录

网上说只须要头文件便可,不过我仍是连接了。。。

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

spdlog linux编译出错,【C++】spdlog--log4cxx有点笨重,试一试spdlog相关推荐

  1. spdlog linux编译出错,spdlog在工厂方法上崩溃

    昨天我已经开始将spdlog包含到我的个人项目中以进行日志记录. 到目前为止,我在使库包含工作时遇到了一些问题,但是现在已经完全解决了. 现在,一切都可以正常编译,找到所有标头,但是当我尝试创建记录器 ...

  2. spdlog linux编译出错,c++日志库spdlog

    /*需要包含的头文件*/ #include "spdlog/spdlog.h" #include // EXIT_FAILURE #include #include void as ...

  3. spdlog linux编译出错,Linux下编写Makefile引入第三方库

    Linux下编写Makefile引入第三方库 前言:一直在使用CmakaList 生成Makefile文件,其实很少去写Makefile,但是最近帮朋友处理了一个Makefile引入第三方库的问题,就 ...

  4. spdlog linux编译出错,spdlog 基本结构分析

    spdlog 基本结构分析 代码取自 V1.5.0, 代码堪称美学. spdlog 是一个只有头文件的C++日志库,速度非常快,扩展性很强,更重要的是 社区活跃,文档齐全. 使用 {fmt} 的格式使 ...

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

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

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

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

  7. linux编译安装Nginx1.6.0+MySQL5.6.19+PHP5.5.14

    linux编译安装Nginx1.6.0+MySQL5.6.19+PHP5.5.14的方法对于 我这个小菜菜来讲是非常的复杂的还好有这篇文章,下面一起来看看吧. 一.使用系统镜像文件配置本地yum源 1 ...

  8. Linux编译x86架构内核出现_stack_chk_guard未定义错误

    背景 android模拟器运行于virtualbox中,而virtualbox运行于x86架构的pc端,所以android及其Linux内核都编译成x86架构.当virtualbox的vt未开启的情况 ...

  9. 新唐NUC980使用记录:U-Boot Linux 编译与烧录(基于SPI NAND)

    文章目录 目的 U-Boot编译 U-Boot环境变量 Linux编译 默认设置 使用SPI NAND剩余分区 使用SPI NAND YAFFS2作为rootfs 打包镜像 总结 目的 这篇文章中将测 ...

最新文章

  1. 浅显易懂 Makefile 入门 (06)— 文件名操作函数(dir、notdir、suffix、basename、addsuffix、addperfix、join、wildcard)
  2. iPhone开发之 ARC是什么
  3. 获取不到app.config里面的数据库连接字符串的解决方法
  4. SAP FI系列培训视频教程
  5. v-charts显示标题
  6. 两栈共享存储空间算法
  7. 微信公众号配置后台接入
  8. 一个敏捷教练成长必备的8项技能
  9. ps 学习布尔运算运用方法
  10. spy——[1220] SPY
  11. python背单词游戏,python背单词小程序
  12. 一键u盘装win7系统教程图解
  13. Android高级面试题精选
  14. HTML5游戏开发案例教程
  15. 威锋VIA VL150 e-marker芯片
  16. 上海移动网红套餐来袭,大流量融合套餐200兆宽带起免费用!
  17. JAVA实战项目【2】(面向对象图书小练习)
  18. 基于chatgpt的社区教育网站开发教程
  19. ios工程超级无敌详细设置(包括homevrew下载和pod配置,git ssh设置)
  20. MFC多窗口切换—如TabControl

热门文章

  1. C语言 strlen(int),C语言 - strlen函数及int,char转换问题
  2. JAVA面试灵魂108问(十七)---数据库4
  3. ML之FE:Vintage曲线/Vintage分析(观察用户的全周期风险情况/明确用户风险的成熟期/确定逾期率何时趋向于稳定/从而选择合适的表现期)的简介、计算逻辑、案例应用之详细攻略
  4. C++——析构函数什么时候被调用
  5. 有了这款自动标注/切图神器,攻城狮终于可以省心了
  6. 2.1 HI3518+RTSP
  7. 深度学习基础系列| Global Average Pooling是否可以替代全连接层?
  8. SYSTEMTIME、FILEITIME、LOCLTIME、UTC、QDateTime等各种时间
  9. 三层架构与四大天王之——增
  10. NestedVAE: Isolating Common Factors via Weak Supervision.