spdlog linux编译出错,【C++】spdlog--log4cxx有点笨重,试一试spdlog
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相关推荐
- spdlog linux编译出错,spdlog在工厂方法上崩溃
昨天我已经开始将spdlog包含到我的个人项目中以进行日志记录. 到目前为止,我在使库包含工作时遇到了一些问题,但是现在已经完全解决了. 现在,一切都可以正常编译,找到所有标头,但是当我尝试创建记录器 ...
- spdlog linux编译出错,c++日志库spdlog
/*需要包含的头文件*/ #include "spdlog/spdlog.h" #include // EXIT_FAILURE #include #include void as ...
- spdlog linux编译出错,Linux下编写Makefile引入第三方库
Linux下编写Makefile引入第三方库 前言:一直在使用CmakaList 生成Makefile文件,其实很少去写Makefile,但是最近帮朋友处理了一个Makefile引入第三方库的问题,就 ...
- spdlog linux编译出错,spdlog 基本结构分析
spdlog 基本结构分析 代码取自 V1.5.0, 代码堪称美学. spdlog 是一个只有头文件的C++日志库,速度非常快,扩展性很强,更重要的是 社区活跃,文档齐全. 使用 {fmt} 的格式使 ...
- c++日志库实战——spdlog,是不是感觉log4cxx有点笨重,不妨试一试spdlog
c++日志库实战--spdlog,是不是感觉log4cxx有点笨重,不妨试一试spdlog 背景 更新记录 spdlog是什么 spdlog快速入门 编译 CMake手动方式 Vcpkg全自动方式(推 ...
- 【C++】spdlog--log4cxx有点笨重,试一试spdlog
spdlog是什么 Fast C++ logging library 按照官方介绍,是一个高性能的C++日志组件,支持跨平台,兼容 C++11.原来项目中使用的是log4cxx,我感觉稍微有点笨重,并 ...
- linux编译安装Nginx1.6.0+MySQL5.6.19+PHP5.5.14
linux编译安装Nginx1.6.0+MySQL5.6.19+PHP5.5.14的方法对于 我这个小菜菜来讲是非常的复杂的还好有这篇文章,下面一起来看看吧. 一.使用系统镜像文件配置本地yum源 1 ...
- Linux编译x86架构内核出现_stack_chk_guard未定义错误
背景 android模拟器运行于virtualbox中,而virtualbox运行于x86架构的pc端,所以android及其Linux内核都编译成x86架构.当virtualbox的vt未开启的情况 ...
- 新唐NUC980使用记录:U-Boot Linux 编译与烧录(基于SPI NAND)
文章目录 目的 U-Boot编译 U-Boot环境变量 Linux编译 默认设置 使用SPI NAND剩余分区 使用SPI NAND YAFFS2作为rootfs 打包镜像 总结 目的 这篇文章中将测 ...
最新文章
- 浅显易懂 Makefile 入门 (06)— 文件名操作函数(dir、notdir、suffix、basename、addsuffix、addperfix、join、wildcard)
- iPhone开发之 ARC是什么
- 获取不到app.config里面的数据库连接字符串的解决方法
- SAP FI系列培训视频教程
- v-charts显示标题
- 两栈共享存储空间算法
- 微信公众号配置后台接入
- 一个敏捷教练成长必备的8项技能
- ps 学习布尔运算运用方法
- spy——[1220] SPY
- python背单词游戏,python背单词小程序
- 一键u盘装win7系统教程图解
- Android高级面试题精选
- HTML5游戏开发案例教程
- 威锋VIA VL150 e-marker芯片
- 上海移动网红套餐来袭,大流量融合套餐200兆宽带起免费用!
- JAVA实战项目【2】(面向对象图书小练习)
- 基于chatgpt的社区教育网站开发教程
- ios工程超级无敌详细设置(包括homevrew下载和pod配置,git ssh设置)
- MFC多窗口切换—如TabControl
热门文章
- C语言 strlen(int),C语言 - strlen函数及int,char转换问题
- JAVA面试灵魂108问(十七)---数据库4
- ML之FE:Vintage曲线/Vintage分析(观察用户的全周期风险情况/明确用户风险的成熟期/确定逾期率何时趋向于稳定/从而选择合适的表现期)的简介、计算逻辑、案例应用之详细攻略
- C++——析构函数什么时候被调用
- 有了这款自动标注/切图神器,攻城狮终于可以省心了
- 2.1 HI3518+RTSP
- 深度学习基础系列| Global Average Pooling是否可以替代全连接层?
- SYSTEMTIME、FILEITIME、LOCLTIME、UTC、QDateTime等各种时间
- 三层架构与四大天王之——增
- NestedVAE: Isolating Common Factors via Weak Supervision.