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)
上一篇 2022年6月23日 下午2:00
下一篇 2022年6月23日 下午2:00


相关推荐

  • eclipse SVN javaHL not available 问题解决「建议收藏」

    eclipse SVN javaHL not available 问题解决「建议收藏」SVN插件下载地址及更新地址,你根据需要选择需要的版本。Linksfor1.8.xRelease:EclipseupdatesiteURL:http://subclipse.tigris.org/update_1.8.xsvn插件包下载:http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=2240Linksfor1.6.xRelease:EclipseupdatesiteURL:ht…

    2022年10月14日
    4
  • 纵向、横向导航菜单及二级弹出菜单

    纵向、横向导航菜单及二级弹出菜单一、纵向导航菜单及二级弹出菜单首先在body中添加一个div标签,其中包含ulliul的标签结构存放网站菜单,效果如下:&lt;%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%&gt;&lt;%Stringpath=request.getContextPath();StringbasePath=…

    2022年7月26日
    15
  • axure8.1.0.3381授权密钥

    axure8.1.0.3381授权密钥nbsp License zdfansKey fZw2VoYzXakl HNMqdr WZKkaa6 nbsp Licensee zd423Key LrZoHQetrL7O XOR32hQkrxkY

    2026年3月16日
    2
  • CSS-基础篇

    CSS-基础篇CSS 基础部分自学笔记内联样式也称行内或行间样式 是在 html 标签上添加 style 属性来实现的内部样式在 style style 标签内添加的样式 内部样式的代码可以复用 符合 W3C 标准 尽量让结构和样式分开处理外部样式 linkrel stylesheet href rel 指定资源跟页面的关系 href 资源的地址 importurl common css 这种方式有很多问题 不建议使用颜色表示法单词表示法 linkrel stylesheet href

    2026年3月16日
    3
  • 分析谷歌收购摩托罗拉无线对移动产业带来的影响

    分析谷歌收购摩托罗拉无线对移动产业带来的影响小记 收购第二天和范凯同学的对谈 整理成文字分享给大家 Google 为何收购摩托罗拉移动 蒋涛 最主要的是购买专利 在北电专利拍卖竞购中 Google 曾经出价 31 4 亿美元 而 Google 收购摩托罗拉的专利数现在披露出来的有 17000 个 还有 7500 个专利在审批中 所以通过这次

    2026年3月26日
    3
  • embed标签的使用

    embed标签的使用br 播放器插件使用说明 br br 代码 EMBEDsrc music mid autostart true loop 2 width 80 height 30 br src 音乐文件的路径及文件名 完整的路径或 URL br br ShowTracker 为是否显示播放进度条 br br ShowPosition 为是否显示播放控制按钮如快进等 br br ShowAudioCon 为控制是否显

    2026年3月16日
    4

发表回复

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

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