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

spdlog linux编译出错,【C++】spdlog–log4cxx有点笨重,试一试spdlogspdlog是什么linuxFastC++logginglibrary按照官方介绍,是一个高性能的C++日志组件,支持跨平台,兼容C++11。原来项目中使用的是log4cxx,我感受稍微有点笨重,而且好久没有更新了。ios在新项目中,我只须要一款轻量级的日志组件,能:git存文件按照天数切分快速的浏览了spdlog,知足个人需求,因而开搞!githubspdlog快速入门如下内容来自spd…

大家好,又见面了,我是你们的朋友全栈君。

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

文件

d81b7cacebff94ccce9be8f12fa31b9f.png

附录

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/152334.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • insertBefore()

    insertBefore()insertBefore()方法将把一个给定的节点插入到一个给定元素节点的给定子节点前面,他返回一个指向新增子节点的引用指针:如上所示,节点newNode将被插入元素节点element并出现在节点t

  • 线性代数,行列式(加边法求行列式例题)

    一、二阶和三阶行列式1.二阶行列式PS:只适用于二元线性方程;2.三阶行列式 二、全排列及其逆序数1.全排列把n个不同的元素排成一列,叫做这n个元素的全排列;2.逆序数对于n个不同的元素,先规定各元素之间有一个标准次序,于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时,就说有一个一个逆序,一个排列中所有逆序的总数叫做这个排列的逆序数。…

  • 什么是跨域?如何解决?

    什么是跨域?如何解决?一、什么是跨域?跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。例如:a页面想获取b页面资源,如果a、b页面的协议、域名、端口、子域名不同,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源。注意:跨域限制访问,其实是浏览器的限制。理解这一点很重要!!!同源策略:是指协议,域名,端口都要相同,其中有一个不同都会产生跨域;二、跨域访问示例假设有两个网站,A网站部署在:.

  • 八皇后问题详解(四种解法)

    八皇后问题详解(四种解法)如果你去百度百科八皇后这个问题,你会发现人家也是历史上有头有脸的一个问题,最后一句“计算机发明后就有一万种方式解决这个问题”读起来也让程序猿们很快活。闲话少说,开始阐述我的思路:最无脑的解法一定是八个for遍历,浪费了太多的计算资源在各种无用功上面,我们稍微构思一下:首先如何决定下一个皇后能不能放这里可以有两种思路,第一种是尝试维护一个8*8的二维矩阵,每次找到一个空位放下一个皇后就把对应行列对

  • IDEA 安装 Lombok 插件

    IDEA 安装 Lombok 插件

  • kafka基础教程_spark kafka

    kafka基础教程_spark kafka一、基本概念Kafka™用于构建实时数据流水线和流媒体应用,具有水平可扩展性,容错性,并在数千家公司得到了应用。流媒体平台(streamingplatform)有三个关键功能:1.发布和订阅记录流。在这方面,类似于消息队列或企业消息系统。2.以容错方式存储记录流。3.实时处理记录流。Kafka被用于两大类应用程序:1.构建可在系统或应用程序之间可靠获取数据的

    2022年10月16日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号