【C++风云录】优秀的C++日志库:让日志记录与调试变得轻松

日志记录与调试

日志记录与调试:提升C++项目开发效率的利器

前言

在C++项目开发过程中,日志记录与调试是非常重要的环节。通过对程序的运行过程进行日志记录,开发者可以快速定位问题和追踪代码的执行情况,提高开发效率和代码质量。为了满足不同项目的需求,有许多优秀的C++日志库可供选择。本文将介绍几个常用的C++日志库,包括spdlog、Boost.Log、Log4cpp、Easylogging++、Poco Logging和Google Logging Library (glog),详细介绍它们的特点和使用示例,帮助开发者选择合适的库来进行日志记录与调试操作。

欢迎订阅专栏:C++风云录

文章目录

    • 日志记录与调试
  • 日志记录与调试:提升C++项目开发效率的利器
    • 前言
      • 1. spdlog
        • 1.1 概述
        • 1.2 主要特点
        • 1.3 使用示例
      • 2. Boost.Log
        • 2.1 概述
        • 2.2 主要特点
        • 2.3 使用示例
      • 3. Log4cpp
        • 3.1 概述
        • 3.2 主要特点
        • 3.3 使用示例
      • 4. Easylogging++
        • 4.1 概述
        • 4.2 主要特点
        • 4.3 使用示例
      • 5. Poco Logging
        • 5.1 概述
        • 5.2 主要特点
        • 5.3 使用示例
      • 6. Google Logging Library (glog)
        • 6.1 概述
        • 6.2 主要特点
        • 6.3 使用示例
    • 总结

1. spdlog

1.1 概述

spdlog是一个快速的C++日志库,支持多线程和格式化输出。它具有高性能和低开销的特点,可以用于大部分C++项目的日志记录和调试需求。

1.2 主要特点
  • 多线程支持:spdlog可以在多线程环境下安全地记录日志信息,并提供了相应的线程安全机制。
  • 格式化输出:spdlog支持使用类似于printf的格式化字符串来定义日志信息的输出格式,方便开发者根据需求进行定制。
  • 高性能:spdlog使用了优化的日志写入和缓冲机制,可以快速地写入大量的日志信息,而不会对程序的执行造成明显的性能损耗。
  • 易于使用:spdlog提供了简洁而直观的API,方便开发者快速上手和使用。
1.3 使用示例
#include <spdlog/spdlog.h>void init_logging()
{spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%t] [%l] %v");spdlog::set_level(spdlog::level::info);spdlog::info("Hello, spdlog!");
}int main()
{init_logging();return 0;
}

以上是一个使用spdlog进行日志记录的示例。在示例中,我们通过调用spdlog::set_pattern函数设置了日志输出格式,通过调用spdlog::set_level函数设置了日志级别为info。然后,我们通过调用spdlog::info函数记录一条info级别的日志信息。

2. Boost.Log

2.1 概述

Boost.Log是Boost库中提供的一个日志库,具有丰富的功能和易于扩展的特点。Boost.Log可以轻松地集成到C++项目中,为开发者提供强大的日志记录和调试功能。

2.2 主要特点
  • 灵活的配置:Boost.Log提供了灵活的配置选项,可以根据项目的具体需求进行定制。开发者可以自定义日志输出格式、级别过滤器、后端存储等配置参数。
  • 强大的过滤功能:Boost.Log支持根据日志级别、消息内容、源代码位置等进行灵活的过滤和筛选。开发者可以根据需要设置过滤条件,只记录感兴趣的日志信息。
  • 多线程支持:Boost.Log具有良好的多线程支持,可以在多线程环境下安全地记录和处理日志信息。
2.3 使用示例
#include <boost/log/core.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/sinks.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/utility/setup.hpp>namespace logging = boost::log;void init_logging()
{logging::core::get()->set_filter(logging::trivial::severity >= logging::trivial::info);logging::add_console_log(std::cout, logging::keywords::format = "[%TimeStamp%] [%ThreadID%] [%Severity%]: %Message%");logging::add_file_log(logging::keywords::file_name = "mylog.log", logging::keywords::format = "[%TimeStamp%] [%ThreadID%] [%Severity%]: %Message%");
}int main()
{init_logging();BOOST_LOG_TRIVIAL(info) << "Hello, Boost.Log!";return 0;
}

以上是一个使用Boost.Log进行日志记录的示例。在示例中,我们通过调用logging::core::get()->set_filter函数设置了日志输出级别为info,通过调用logging::add_console_log函数设置了控制台输出日志的格式,通过调用logging::add_file_log函数设置了文件输出日志的格式和日志文件名。然后,通过使用BOOST_LOG_TRIVIAL宏记录一条info级别的日志信息。

3. Log4cpp

3.1 概述

Log4cpp是一个成熟的C++日志库,提供了丰富的功能和灵活的配置选项。Log4cpp采用了面向对象的设计思想,可以方便地集成到C++项目中,并提供可靠的日志记录和调试功能。

3.2 主要特点
  • 多种日志输出方式:Log4cpp支持将日志信息输出到控制台、文件、系统日志和网络等多种方式。
  • 灵活的配置选项:Log4cpp提供了丰富的配置选项,可以根据需要自定义日志的输出格式、级别过滤器、日志追踪等设置。
  • 多线程支持:Log4cpp具有良好的多线程支持,可以在多线程环境下安全地进行日志记录和调试操作。
3.3 使用示例
#include <log4cpp/Category.hh>
#include <log4cpp/PropertyConfigurator.hh>void init_logging()
{log4cpp::PropertyConfigurator::configure("log4cpp.properties");log4cpp::Category& root = log4cpp::Category::getRoot();root.info("Hello, Log4cpp!");
}int main()
{init_logging();return 0;
}

以上是一个使用Log4cpp进行日志记录的示例。在示例中,我们通过调用log4cpp::PropertyConfigurator::configure函数加载日志配置文件,日志配置文件中包含了日志输出方式和相应的配置选项。然后,通过调用log4cpp::Category::getRoot函数获取根日志类别对象,并使用info函数记录一条info级别的日志信息。

4. Easylogging++

4.1 概述

Easylogging++是一个轻量级且易于使用的C++日志库,具有简洁的API和高度可扩展的特点。Easylogging++提供了丰富的功能,包括日志级别控制、输出格式定制和日志文件分割等。

4.2 主要特点
  • 简洁的API:Easylogging++的API设计简洁明了,可以方便地进行日志记录和调试操作。
  • 高度可扩展:Easylogging++支持自定义日志格式、筛选条件和后端存储等,可以满足各种项目的需求。
  • 轻量级:Easylogging++的代码量较小,不会对项目的性能和体积造成明显影响。
  • 跨平台支持:Easylogging++支持在多个平台上运行,并提供了相应的平台特定功能和适配层。
4.3 使用示例
#include <easylogging++.h>void init_logging(int argc, char** argv)
{el::Configurations conf("easylogging.cfg");el::Loggers::reconfigureAllLoggers(conf);el::Loggers::addFlag(el::LoggingFlag::ColoredTerminalOutput);LOG(INFO) << "Hello, Easylogging++!";
}int main(int argc, char** argv)
{init_logging(argc, argv);return 0;
}

以上是一个使用Easylogging++进行日志记录的示例。在示例中,我们通过调用el::Configurations构造函数加载日志配置文件,日志配置文件中包含了日志输出方式和相应的配置选项。然后,通过使用LOG(INFO)宏记录一条info级别的日志信息。

5. Poco Logging

5.1 概述

Poco Logging是Poco库中提供的日志组件,具有丰富的功能和灵活的配置选项。Poco Logging可以方便地集成到C++项目中,为开发者提供可靠的日志记录和调试功能。

5.2 主要特点
  • 多种日志输出方式:Poco Logging支持将日志信息输出到控制台、文件、系统日志和网络等多种方式。
  • 灵活的配置选项:Poco Logging提供了灵活的配置选项,可以根据具体需求设置日志的输出格式、级别过滤器和后端存储。
  • 多线程支持:Poco Logging具有较好的多线程支持,可以在多线程环境下安全地进行日志记录和调试操作。
5.3 使用示例
#include <Poco/AutoPtr.h>
#include <Poco/Logger.h>
#include <Poco/ConsoleChannel.h>
#include <Poco/FileChannel.h>
#include <Poco/FormattingChannel.h>
#include <Poco/PatternFormatter.h>
#include <Poco/Util/Application.h>using Poco::AutoPtr;
using Poco::Logger;
using Poco::ConsoleChannel;
using Poco::FileChannel;
using Poco::FormattingChannel;
using Poco::PatternFormatter;
using Poco::Util::Application;class MyApp : public Application
{
protected:void initialize(Application& self){AutoPtr<ConsoleChannel> pConsoleChannel(new ConsoleChannel);AutoPtr<PatternFormatter> pPatternFormatter(new PatternFormatter);pPatternFormatter->setProperty("pattern", "%Y-%m-%d %H:%M:%S %s: %t");AutoPtr<FormattingChannel> pFormattingChannel(new FormattingChannel(pPatternFormatter, pConsoleChannel));Logger::root().setChannel(pFormattingChannel);Logger& logger = Logger::get("MyLogger");AutoPtr<FileChannel> pFileChannel(new FileChannel("mylog.log"));logger.setChannel(pFileChannel);Application::initialize(self);}int main(const std::vector<std::string>& args){Logger& logger = Logger::get("MyLogger");logger.information("Hello, Poco Logging!");return Application::EXIT_OK;}
};int main(int argc, char** argv)
{MyApp app;return app.run(argc, argv);
}

以上是一个使用Poco Logging进行日志记录的示例。在示例中,我们通过使用Poco库中的各个组件来实现日志的初始化和记录。通过设置console channel和file channel,我们可以分别将日志信息输出到控制台和日志文件中。

6. Google Logging Library (glog)

6.1 概述

Google Logging Library(简称glog)是Google开发的C++日志库,具有高性能和易于使用的特点。glog在Google内部被广泛使用,并已开源供开发者使用。

6.2 主要特点
  • 高性能:glog使用了优化的日志写入和缓冲机制,可以快速地写入大量的日志信息,而不会对程序的执行造成明显的性能损耗。
  • 灵活的配置选项:glog提供了丰富的配置选项,可以根据项目的具体需求进行定制。开发者可以自定义日志输出格式、级别过滤器和后端存储等参数。
  • 多线程支持:glog具有良好的多线程支持,可以在多线程环境下安全地记录和处理日志信息。
6.3 使用示例
#include <glog/logging.h>void init_logging()
{google::InitGoogleLogging("MyApplication");google::LogToStderr();LOG(INFO) << "Hello, glog!";
}int main()
{init_logging();return 0;
}

以上是一个使用glog进行日志记录的示例。在示例中,我们通过调用google::InitGoogleLogging函数初始化glog,并通过调用google::LogToStderr函数将日志信息输出到标准错误流。然后,通过使用LOG(INFO)宏记录一条info级别的日志信息。

以上是几个与日志记录与调试相关的C++库的详细介绍和完整实例代码。开发者可以根据项目的需求选择合适的库来进行日志记录和调试操作。

总结

日志记录与调试对于C++项目开发来说是非常重要的,它可以帮助开发者快速定位问题和追踪代码的执行情况。在本文中,我们介绍了几个常用的C++日志库,包括spdlog、Boost.Log、Log4cpp、Easylogging++、Poco Logging和Google Logging Library (glog)。这些库都具有不同的特点和优势,可以满足各种项目的需求。通过学习和了解这些库,开发者可以选择合适的库来记录和调试日志信息,提高项目的开发效率和代码质量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/797265.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记一次安服薅洞实战

记一次为数不多但还算有点收获的一次实战&#xff08;平时摸鱼来着...&#xff09;&#xff0c;大致任务是对某某市某*院进行次漏洞收集和外网资产梳理且是有授权的&#xff08;其实是甲方不大清楚自己外网有多少资产&#xff09;&#xff0c;漏洞质量要求还挺高。emmm本来是打…

大米自动化生产线设备:现代粮食加工的核心力量

随着科技的不断进步和粮食加工行业的快速发展&#xff0c;大米自动化生产线设备在现代粮食加工中的地位愈发重要。这些设备不仅大大提高了生产效率&#xff0c;还保证了产品的质量和安全&#xff0c;成为了现代粮食加工行业不可或缺的核心力量。 一、自动化生产线设备助力效率提…

【面试经典150 | 动态规划】交错字符串

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;动态规划 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容进行…

一些Java面试题

1、 Java语言有哪些特点 1、简单易学、有丰富的类库 2、面向对象&#xff08;Java最重要的特性&#xff0c;让程序耦合度更低&#xff0c;内聚性更高&#xff09; 3、与平台无关性&#xff08;JVM是Java跨平台使用的根本&#xff09; 4、可靠安全 5、支持多线程 2、面向对象和…

1.8.3 卷积神经网络近年来在结构设计上的主要发展和变迁——GoogleNet/inception-v1

1.8.3 卷积神经网络近年来在结构设计上的主要发展和变迁——GoogleNet/ inception-v1 前情回顾&#xff1a; 1.8.1 卷积神经网络近年来在结构设计上的主要发展和变迁——AlexNet 1.8.2 卷积神经网络近年来在结构设计上的主要发展和变迁——VGGNet GoogleNet问题 在VGGNet简单堆…

(2024)Ubuntu源码安装多个版本的opencv并切换使用

本人工作会用到x86_64的opencv和aarch64的opencv&#xff0c;所以写下来备忘自用 一、源码编译安装 依赖库安装&#xff1a; sudo apt-get install build-essential libgtk2.0-dev libgtk-3-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev o…

卷积神经网络实战

构建卷积神经网络 卷积网络中的输入和层与传统神经网络有些区别&#xff0c;需重新设计&#xff0c;训练模块基本一致 1.首先读取数据 - 分别构建训练集和测试集&#xff08;验证集&#xff09; - DataLoader来迭代取数据 # 定义超参数 input_size 28 #图像的总尺寸28*28…

JSX 和 HTML 之间的区别

JSX和 HTML 都是用于创建和构建网页的标记语言&#xff0c;但它们有一些关键的区别。 1. JSX 是 JavaScript 的语法扩展&#xff0c;而 HTML 是一种标记语言。 2. JSX 允许您在语法中包含表达式和函数&#xff0c;而 HTML 只允许静态文本。 3. JSX 通常用于 React 应用程序&…

Spring Boot整合Kafka+SSE实现实时数据展示

2024年3月10日 知识积累 为什么使用Kafka&#xff1f; 不使用Rabbitmq或者Rocketmq是因为Kafka是Hadoop集群下的组成部分&#xff0c;对于大数据的相关开发适应性好&#xff0c;且当前业务场景下不需要使用死信队列&#xff0c;不过要注意Kafka对于更新时间慢的数据拉取也较…

73.矩阵置零

题目描述 解题思路 ——————初步思路&#xff0c;暴力求解—————— 1.遍历原矩阵&#xff0c;记录0位置的行列值&#xff0c;存入数组flags中&#xff0c;作为标志 2.读取flags中的元素&#xff0c;获取要置为0的行列值&#xff0c;然后两个循环将matrix中的对应元…

【代码】二分法求最小值

仅适用于以下情况&#xff1a;区间内单调或者最多一个极小值 代码 以[0,pi]内的三角函数为例 clc clear close allx0:pi/1000:pi; ytest(x); figure() plot(x,y,.)cutnum100;x1x(1); x2x(end); error_max10^-1000;%能接受的误差上限 for i1:cutnum%这里cutnum是取值上限num(…

电池二次利用走向可持续大循环周期的潜力和挑战(第一篇)

一、背景 当前&#xff0c;气候变化是全球可持续发展面临的重大挑战。缓解气候变化最具挑战性的目标是在本世纪中期实现碳中和&#xff08;排放量低到足以被自然系统安全吸收&#xff09;&#xff0c;其中电动汽车&#xff08;EV&#xff09;的引入是一项关键举措。电动汽车在…

SSL根证书是什么

根证书是什么&#xff1f; 根证书是CA认证中心给自己颁发的证书,是信任链的起始点。安装根证书意味着对这个CA认证中心的信任。 从技术上讲&#xff0c;证书其实包含三部分&#xff0c;用户的信息&#xff0c;用户的公钥&#xff0c;还有CA中心对该证书里面的信息的签名&#…

对代理模式的理解

目录 一、前言二、案例1 代码2 自定义代理类【静态代理】2.1 一个接口多个实现&#xff0c;到底注入哪个依赖呢&#xff1f;2.1.1 Primary注解2.1.2 Resource注解&#xff08;指定name属性&#xff09;2.1.3 Qualifier注解 2.2 面向接口编程2.3 如果没接口咋办呢&#xff1f;2.…

替代安全指标(Surrogate Safety Measures (SSM) )

替代安全措施&#xff08;Surrogate Safety Measures (SSM) &#xff09;用于从数据中寻找接近碰撞&#xff0c;或可能发生&#xff08;但实际没有发生&#xff09;的碰撞事件。 SSM的两个合格标准&#xff1a; &#xff08;1&#xff09;它应该来自与碰撞直接相关的交通冲突&…

阿里巴巴中国站获得1688商品详情 API:如何通过API接口批量获取价格、标题、图片、库存等数据

在数字化时代&#xff0c;数据的重要性不言而喻。对于电商从业者来说&#xff0c;获取商品详情数据是提升业务效率和用户体验的关键。阿里巴巴中国站作为电商行业的巨头&#xff0c;提供了丰富的API接口&#xff0c;方便开发者们批量获取商品信息。本文将详细叙述如何通过阿里巴…

C语言——详解字符函数和字符串函数(二)

Hi,铁子们好呀&#xff01;之前博主给大家简单地介绍了部分字符和字符串函数&#xff0c;那么这次&#xff0c;博主将会把这些字符串函数给大家依次讲完&#xff01; 今天讲的具体内容如下: 文章目录 6.strcmp函数的使用及模拟实现6.1 strcmp函数介绍和基本使用6.1.1 strcmp函…

总结:微信小程序中跨组件的通信、状态管理的方案

在微信小程序中实现跨组件通信和状态管理,有以下几种主要方案: 事件机制 通过事件机制可以实现父子组件、兄弟组件的通信。 示例: 父组件向子组件传递数据: 父组件: <child binddata"handleChildData" /> 子组件: Component({..., methods: { handleChildData(…

Linux网卡与IP地址:通往网络世界的通行证

在探索Linux网卡和IP地址的关系之前&#xff0c;我们得先理解Linux网卡是怎么工作的。想象一下&#xff0c;每台计算机都是一个世界&#x1f30e;&#xff0c;而网卡就是连接这些世界的门户&#x1f6aa;。网卡的工作就是接收和发送数据包&#xff0c;就像邮差&#x1f4ec;递送…

RabbitMQ3.13.0起支持MQTT5.0协议及MQTT5.0特性功能列表

RabbitMQ3.13.0起支持MQTT5.0协议及MQTT5.0特性功能列表 文章目录 RabbitMQ3.13.0起支持MQTT5.0协议及MQTT5.0特性功能列表1. MQTT概览2. MQTT 5.0 特性1. 特性概要2. Docker中安装RabbitMQ及启用MQTT5.0协议 3. MQTT 5.0 功能列表1. 消息过期1. 描述2. 举例3. 实现 2. 订阅标识…