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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 国内期货软件开发_正规期货外盘平台

    国内期货软件开发_正规期货外盘平台期货软件搭建-期货软件开发-期货平台搭建,要想做期货软件开发定制,网站的安全性和稳定性非常重要,要搭建一款安全有保障的期货软件,找专业的金融软件搭建公司是必不可少的,那么期货软件开发,期货平台搭建的流程特点有哪些呢?  1.要搭建好用的软件,软件的部署成本和软件的易用性要好一款成熟稳重的期货软件,要经得起时间的推敲,很多公司通过购买软件给到用户,其实他们满足不了二次开发的需求,导致软件更新和后期维护上面根本维护不了。2.要搭建期货平台,价格一定要合理,不要贪图小便宜好的期货平台搭建很多人贪图小便宜,

    2025年10月20日
    4
  • 银行家算法-C语言实现

    银行家算法-C语言实现算法简介银行家算法(Banker’sAlgorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。—百度百科当一个进程申请使用资源的时候,银行家算法通过先试探分配给该进程资源,然后通过安全性算法判断分配后的系统是否处于安全状态,若不安全则试探分配作废,让该进程继续等待。安全性算法是判断分配后的系统是否会进入不安全状态,若不存在安全序列,则判定系统已经进入

    2022年6月5日
    36
  • 球迷 如何在Linux纯命令行玩转谷歌浏览器,边看欧洲杯,边看足球宝贝[通俗易懂]

    球迷 如何在Linux纯命令行玩转谷歌浏览器,边看欧洲杯,边看足球宝贝[通俗易懂]lsp们,如何在Linux命令行,玩转谷歌浏览器,边看欧洲杯,边搜索足球宝贝

    2022年4月30日
    84
  • 百度地图API显示多个标注点带百度样式信息检索窗口的代码

    百度地图API显示多个标注点带百度样式信息检索窗口的代码

    2021年10月10日
    40
  • 【nodejs】node不是内部或外部命令

    【nodejs】node不是内部或外部命令

    2021年10月1日
    50
  • lambda表达式用法_使用lambda表达式定义函数

    lambda表达式用法_使用lambda表达式定义函数(一)输入参数在Lambda表达式中,输入参数是Lambda运算符的左边部分。它包含参数的数量可以为0、1或者多个。只有当输入参数为1时,Lambda表达式左边的一对小括弧才可以省略。输入参数的数量大于或者等于2时,Lambda表达式左边的一对小括弧中的多个参数质检使用逗号(,)分割。示例1下面创建一个Lambda表达式,它的输入参数的数量为0.该表达式将显示“ThisisaLambdae…

    2026年1月26日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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