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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 浅谈数字音视频传输网络——AVB[通俗易懂]

    AVB有两种流格式:AM824和AAF。AM824支持24bit音频,iec60958音频编码(SPDIF和AES3),SMPTE时间码和MIDI。对于发送端AM824有三个选项“non-blocking(sync)”、“non-blocking(aync)”和“blocking”。流量整形是为了避免在以太网中发生丢弃数据的情况,通常采用漏桶算法(LeakyBucket)来完成流量整形或速率限制(RateLimiting)。它的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。

    2022年4月14日
    263
  • java 获取字符串编码格式_输入字符串的格式要求

    java 获取字符串编码格式_输入字符串的格式要求publicstaticStringgetEncoding(Stringstr){ Stringencode=”GB2312″; try{ if(str.equals(newString(str.getBytes(encode),encode))){//判断是不是GB2312 Strings=encode; returns;//是的…

    2022年9月13日
    0
  • 使用matplotlib绘制折线图,柱状图,柱线混合图「建议收藏」

    使用matplotlib绘制折线图,柱状图,柱线混合图「建议收藏」matplotlib介绍Matplotlib是Python的绘图库。它可与NumPy一起使用,提供了一种有效的MatLab开源替代方案。它也可以和图形工具包一起使用,如PyQt和wxPython。安装Matplotlib库命令:在cmd命令窗口输入pipinstallmatplotlib。matplotlib绘制折线图绘制一条折线的折线图#-*-c…

    2022年5月31日
    62
  • 改变QLabel背景颜色

    改变QLabel背景颜色在桌面应用程序开发时,需要显示一些状态信息,例如客户端是否掉线,串口是否打开等,我们可以用一些标志显示给用户,例如如果QLabel显示绿色,表示连接成功,显示黑色表示失败。代码如下:ui.label_Status-&gt;clear(); QPalettepalette; palette.setColor(QPalette::Background,Q…

    2022年6月20日
    357
  • Ribbon整合Avalondock 2.0实现多文档界面设计(一)

    Ribbon整合Avalondock 2.0实现多文档界面设计(一)前些时间研究了WPF的一些框架,感觉基于Prism框架的MVVM模式对系统的UI与逻辑分离很好,所以就按照之前Winform的框架设计,用WPF做了一套,感觉比Winform要强很多。MVVM模式和MVC模式一样,主要目的是分离视图(View)和模型(Model),有几大优点1.低耦合。视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的”View”上,…

    2022年7月20日
    19
  • MVC框架理解及优缺点

    MVC框架理解及优缺点

    2021年11月6日
    44

发表回复

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

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