【C++】spdlog--log4cxx有点笨重,试一试spdlog
spdlog是什么
Fast C++ logging library
按照官方介绍,是一个高性能的C++日志组件,支持跨平台,兼容 C++11。原来项目中使用的是log4cxx,我感觉稍微有点笨重,并且很久没有更新了。
在新项目中,我只需要一款轻量级的日志组件,能:
- 存文件
- 按照天数切分
快速的浏览了spdlog,满足我的需求,于是开搞!
spdlog快速入门
github:https://github.com/gabime/spdlog
$ 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,
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,这里是控制台,所以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)");
}
同时输出控制台和文件
// 每天2:30 am 新建一个日志文件
auto logger = spdlog::daily_logger_mt("daily_logger", "logs/daily.txt", 2, 30);
// 遇到warn flush日志,防止丢失
logger->flush_on(spdlog::level::warn);
// 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机制来一次性把日志写入到文件里面持久化。所以如果没有恰当的配置,停止调试或者进程崩溃的时候会有日志丢失的问题。
//每三秒刷新一次
spdlog::flush_every(std::chrono::seconds(3));
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)
关于
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相关推荐
- c++日志库实战——spdlog,是不是感觉log4cxx有点笨重,不妨试一试spdlog
c++日志库实战--spdlog,是不是感觉log4cxx有点笨重,不妨试一试spdlog 背景 更新记录 spdlog是什么 spdlog快速入门 编译 CMake手动方式 Vcpkg全自动方式(推 ...
- spdlog linux编译出错,【C++】spdlog--log4cxx有点笨重,试一试spdlog
spdlog是什么linux Fast C++ logging library 按照官方介绍,是一个高性能的C++日志组件,支持跨平台,兼容 C++11.原来项目中使用的是log4cxx,我感受稍微有 ...
- 扛住100亿次请求?我们来试一试!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | xiaojiaqi 来源 | github.com/xi ...
- python第七章动手试一试_Python学习3
第七章 用户输入和while循环 7.1 函数input()的工作原理 动手试一试: carname=input('Please input the car you want to hire:') p ...
- AI也能写高考作文?我们用清华刚刚开源的「九歌」试了试
晓查 郭一璞 发自 凹非寺 量子位 报道 | 公众号 QbitAI 今天是高考第一天,我猜,你一定在看全国各地那些奇奇怪怪的高考作文题,还要纠结一下: 这题目,该怎么写? 那,写不出来不如扔给AI,看 ...
- python课本第三章答案idle_第三天任务 (【基于Python编程从入门到实践】第三章 列表 书本及动手试一试)...
3.1列表什么是列表 列表是由 一系列特定顺序排列的元素组成的 用方括号[]来表示列表 并用逗号来分隔其中的元素 访问列表元素 索引指定访问的列表元素 使用列表中的各个值 3--1 动手试一试 3.1 ...
- CSS性能优化:可以试一试内联CSS?
CSS性能优化:可以试一试内联CSS? 在互联网的早期,网站主要用于显示基于文本的信息.慢慢地,我们的连接速度得到了提高,用户能够相当快地下载高分辨率图像和视频.现在,网站做的不仅仅是以文本形式提供必 ...
- 试了试Docker桌面应用自带的K8s集群,一个字“简单”
前言 之前给大家介绍过几种在笔记本电脑上安装Kubernetes集群的工具,虽然安装起来不太繁琐但是多多少少还是需要花一些时间的,对于不想瞎倒腾,就想快速安装个本地集群开始学习和测试的同学,推荐你们试 ...
- ios 获取固件版本_觉得iOS测试版本BUG太多?系统降级试一试?
对于那些喜欢折腾手机,尝鲜新功能的小伙伴来说,一但iOS有新的测试版本出来就会更新,但iOS 系统的小更新很是频繁,经常更新难免会出问题,尤其是较大版本间的升级(比如iOS12到iOS13),会让很多 ...
最新文章
- 【leetcode】3Sum
- 网站的domain不在首页的原因
- Java多重链表_Java实现 LeetCode 143 重排链表
- 当前页面excel导出_系统地学习Excel第03课,Excel的工作界面
- Oracle排序查询语句
- 蓝桥杯特殊回文数C语言简易版
- 游戏音乐制作中,编曲和作曲的区别
- AT91SAM9260搭建LINUX操作系统
- 同一目录下批处理执行Word宏
- 香港银行开户多少钱能开下来
- qlv转php,如何将qlv文件转换成mp,qlv文件怎么免费转换为mp4格式
- 《C语言点滴》参考文献
- JSON是什么,做什么用的
- Watir数据驱动 - Excel
- java 获取系统的时区_【转】Java 获取操作系统时区
- robocode调试技巧
- (转)手把手教你写专利申请书•如何申请专利
- Live Server 正常启用 但是网页不更新 解决方法
- 数据库系统工程师考试历年试题分析与解答
- idea 导入 vue项目 improt全都报红
热门文章
- Docker概述与安装
- Oracle11g新特性密码延迟验证的坑
- 信息安全技术——Many Time Pad攻击实验
- 生成1至10位随机数
- java毕业设计电影公司网Mybatis+系统+数据库+调试部署
- 新氧2023年财务业绩预测:退市风险大幅降低,收入增长将放缓
- 巨头“围攻”之下,新氧医美能否“破局”?
- [论文阅读笔记44]Named Entity Recognition without Labelled Data:A Weak Supervision Approach
- Java新手上路--算数运算符
- raid10模型比raid01模型的冗余度高