log4cplus visual c++ 编译及调试小记

简介

最近在调试一款SATA加密设备,发现设备有时加密出来的数据,再解密时与明文对不上,怀疑是通信问题。因此,急需要在测试工具中加入通信日志。由于对第三方日志库都不熟悉,所以随便选了个log4cplus软件集成到现有工具中。

下载地址:在这里
同时还要下载catch2, 在这里
同时还要下载threadpool, 在这里

下载完上述3个开源软件后,用Visual C++进行编译。
编译步骤如下:

  1. 分别解压log4cpp, catch2和threadpool到不同的目录。
  2. 把catch2解压后的内容复制到log4cplus的catch目录下,不包括最外层文件夹。
  3. 把threadpool解压后的内容复制到log4cplus目录下,包括threadpool文件夹本身。

进入到log4cplus/msvc14目录下,在log4cplus.sln上右键,使用visual studio 2019打开项目。

编译

打开项目后,面临编译选择:如下图:
在这里插入图片描述
其中,
log4cplus工程编译出来的是动态库
log4cplusS工程编译出来的是静态库。

由于我的工具很小,不希望依赖动态库,因此我选择了编译log4cplusS工程。

编译前要选择编译时使用的C++标准,否则编译时会报错。‘
在这里插入图片描述
如果下载的是log4cplus2.0.x版本,这版使用的是C++11标准,所以上图中的选择就可以。
如果下载的是log4cplus-master版本,2024年的今天,它使用的是C++20标准,所以要选择要C++20那行。
在这里插入图片描述
其他项目属性都不用动,直接编译x64 debug和 release版本,生成静态库。

静态库引入工程

封装一个类

此处参考:C++日志库log4cplus如何使用

#pragma once#include <log4cplus/logger.h>
#include <log4cplus/fileappender.h>
#include <log4cplus/layout.h>
#include <log4cplus/ndc.h>
#include <log4cplus/helpers/loglog.h>
#include <log4cplus/helpers/property.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/initializer.h>using namespace log4cplus;
using namespace log4cplus::helpers;class MyLogger
{
private:MyLogger(){log4cplus::initialize();helpers::LogLog::getLogLog()->setInternalDebugging(true);SharedObjectPtr<Appender> append_root(new RollingFileAppender(LOG4CPLUS_TEXT("root.log"), 10 * 1024 * 1024, 10, true, true));append_root->setName(LOG4CPLUS_TEXT("root"));std::string pattern = "%d [%c] %m %n";std::unique_ptr<Layout> root_layout(new PatternLayout(pattern));append_root->setLayout(move(root_layout));m_rootLog = log4cplus::Logger::getRoot();m_rootLog.addAppender(append_root);m_rootLog.setLogLevel(ALL_LOG_LEVEL);}~MyLogger(){if (m_logger){delete m_logger;}}static MyLogger* m_logger;public:static MyLogger* getInstance(){if (m_logger == NULL){m_logger = new MyLogger();}return m_logger;}log4cplus::Logger m_rootLog;
};

记录日志啦

//在需要记录日志的类中,添加include
#include "MyLogger.h"//在通信异常的地方记录日志://如果明文与加密后又被解密出的数据不相等if (0 != memcmp(data, output, param->datalen)) {int iilen;MyLogger* log = MyLogger::getInstance();char* hex = new char[8192 * 3];sprintf(hex, "Plain algo=%02X, mode=%d, len=%d:", param->algo, param->mode, param->datalen);iilen = (int)strlen(hex);StringUtil::Bin2Hex(data, &hex[iilen], param->datalen);//记录明文数据LOG4CPLUS_INFO(log->m_rootLog, hex);sprintf(hex, "Encrypted algo=%02X, mode=%d, len=%d:", param->algo, param->mode, elen);iilen = (int)strlen(hex);StringUtil::Bin2Hex(endata, &hex[iilen], elen);//记录密文数据LOG4CPLUS_INFO(log->m_rootLog, hex);sprintf(hex, "Decrypted algo=%02X, mode=%d, len=%d:", param->algo, param->mode, olen);iilen = (int)strlen(hex);StringUtil::Bin2Hex(output, &hex[iilen], olen);//记录解密数据LOG4CPLUS_INFO(log->m_rootLog, hex);delete[] hex;}

由于MyLogger::getInstance()返回的是静态成员指针,所以不需要每次用完都释放,可以在程序退出时释放一次就可以了。

完!

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

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

相关文章

Python中的垃圾回收机制是什么

一、写在前面&#xff1a; 我们都知道Python一种面向对象的脚本语言&#xff0c;对象是Python中非常重要的一个概念。在Python中数字是对象&#xff0c;字符串是对象&#xff0c;任何事物都是对象&#xff0c;而它们的核心就是一个结构体--PyObject。 typedef struct_object{i…

【数据结构——二叉树】二叉树及其应用2023(头歌习题)【合集】

目录 第1关&#xff1a;括号表示法创建二叉树任务描述相关知识编程要求测试说明完整代码 第2关&#xff1a;先序序列创建二叉树任务描述相关知识二叉树的前序遍历如何创建一颗二叉树伪代码如下&#xff1a; 二叉树的中序遍历 编程要求测试说明完整代码 第3关&#xff1a;计算二…

畅捷通的 Serverless 探索实践之路

作者&#xff1a;计缘&#xff0c;阿里云云原生架构师 畅捷通介绍 畅捷通是中国领先的小微企业财税及业务云服务提供商&#xff0c;成立于 2010 年。畅捷通在 2021 年中国小微企业云财税市场份额排名第一&#xff0c;在产品前瞻性及行业全覆盖方面领跑市场&#xff0c;位居中…

使用运程操作电脑向日葵安装MySQl与Navicat的安装

目录 一、向日葵 1.1、简介 1.2、应用场景 1.3、原理&#xff1a; 1.4、使用&#xff1a; 1.5、在实施中的应用场景&#xff1a; 二、在Windows Server2012中安装MySQL 2.1、MySQL简介 2.2、MySQL5.7安装与8.0 2.3、输入命令步骤 三、Navicat 3.1、简介 3.2、安装N…

再见2023,你好2024(附新年烟花python实现)

亲爱的朋友们&#xff1a; 写点什么呢&#xff0c;我已经停更两个月了。2023年快结束了&#xff0c;时间真的过得好快&#xff0c;总要写点什么留下纪念吧。这一年伴随着许多挑战和机会&#xff0c;给了我无数的成长和体验。坦白说&#xff0c;有时候我觉得自己好像是在时间的…

JavaBean

学习目的与要求 熟练掌握<jsp:useBean>、<jsp:setProperty>、<jsp:getProperty>等JSP的操作指令。 本章主要内容 编写JavaBean在JSP中使用JavaBean 一个JSP页面通过使用HTML标记为用户显示数据&#xff08;静态部分&#xff09;&#xff0c;页面中变量的…

BMS均衡技术

一、电池的不一致性&#xff1f; 每个电池都有自己的“个性”&#xff0c;要说均衡&#xff0c;得先从电池谈起。即使是同一厂家同一批次生产的电池&#xff0c;也都有自己的生命周期、自己的“个性”——每个电池的容量不可能完全一致。例如以下的两个原因都会造成电池不一致…

Redis缓存保卫战:拒绝缓存击穿的进攻【redis问题 三】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Redis缓存保卫战&#xff1a;拒绝缓存击穿的进攻 前言缓存击穿的定义和原理为何会发生缓存击穿缓存击穿的危害防范缓存击穿结语: 前言 你是否曾经遇到过系统在高并发情况下出现严重性能问题&#xff…

JavaSE学习笔记 2023-12-28 --MySQL

MySQL 1.数据库介绍 数据库:数据仓库 DataBase:简称DB,用于长期存储有结构的,大量的,共享的数据长期的:持久存储,永久存储 有结构:有类型,有内部的数据类型有关系,数据与数据之前是有关联的 大量的:大多数据库都是以文件系统存在的,可以将数据存储在磁盘中 共享的:多个应用之…

[概率论]四小时不挂猴博士

贝叶斯公式是什么 贝叶斯公式是概率论中的一个重要定理&#xff0c;用于计算在已知一些先验信息的情况下&#xff0c;更新对事件发生概率的估计。贝叶斯公式的表达式如下&#xff1a; P(A|B) P(B|A) * P(A) / P(B) 其中&#xff0c;P(A|B)表示在事件B发生的条件下事件A发生的概…

干洗店洗鞋店小程序核心功能有哪些?

在繁忙的生活中&#xff0c;我们的鞋子常常承载着风尘仆仆的故事。而洗鞋小程序&#xff0c;就是那个让您的鞋子焕然一新的魔法师。通过这个小程序&#xff0c;您可以在线预约、支付&#xff0c;查询洗鞋订单&#xff0c;并与洗鞋店铺进行互动&#xff0c;轻松享受专业的洗鞋服…

小红书如何高效引流?

近年来&#xff0c;公域流量价格不断上涨&#xff0c;私域流量的优势逐渐凸显。企业正花费大量资源和成本来获取新流量&#xff0c;但与其如此&#xff0c;不如将精力放在留存和复购上&#xff0c;从而实现业绩的新增长。其中关键在于如何有效地将公域流量转化为私域流量。 然而…

听GPT 讲Rust源代码--src/tools(38)

File: rust/src/tools/clippy/clippy_dev/src/lib.rs rust/src/tools/clippy/clippy_dev/src/lib.rs文件是Clippy开发工具的入口文件&#xff0c;其作用是提供Clippy开发过程中所需的功能和工具。Clippy是一个Rust代码的静态分析工具&#xff0c;用于提供各种有用的代码规范、编…

在Android设备上设置和使用隧道代理HTTP

随着互联网的深入发展&#xff0c;网络信息的传递已经成为人们日常生活中不可或缺的一部分。对于我们中国人来说&#xff0c;由于某些特殊的原因&#xff0c;访问国外网站时常常会遇到限制。为了解决这个问题&#xff0c;使用代理服务器成为了许多人的选择。而在Android设备上设…

UI5与后端的文件交互(二)

文章目录 前言一、开发Action1. 创建Structure2. BEDF添加Action3. class中实现Action 二、修改UI5 项目1. 添加一个按钮2. 定义事件函数 三、测试及解析1. 测试2. js中提取到的excel流数据3. 后端解析 前言 这系列文章详细记录在Fiori应用中如何在前端和后端之间使用文件进行…

微信小程序开发系列-07组件

微信小程序开发系列目录 《微信小程序开发系列-01创建一个最小的小程序项目》《微信小程序开发系列-02注册小程序》《微信小程序开发系列-03全局配置中的“window”和“tabBar”》《微信小程序开发系列-04获取用户图像和昵称》《微信小程序开发系列-05登录小程序》《微信小程序…

ConcurrentHashMap源码学习

实现接口 ConcurrentMap&#xff08;Map的基础方法&#xff09;、Serializable(序列化) 基础属性 最大容量&#xff1a;2^30 默认容量&#xff1a;16 常用方法 PUT 调用PutVal方法进行插入。 判断key或value是否为空&#xff1a; 是&#xff1a;抛出空指针一场 否&#xff…

【Unity入门】RequireComponent的使用

目录 RequireComponent的作用构造函数 RequireComponent的作用 RequireComponent 属性自动将所需的组件添加为依赖项。 当某个脚本必须依赖其他脚本或者组件共同使用时&#xff0c;为了避免人为添加过程的操作失误&#xff0c;可以在代码中使用RequireComponent&#xff0c;它…

八大算法排序@堆排序(C语言版本)

目录 堆排序大堆排序概念算法思想建堆建堆核心算法建堆的代码 排序代码实现 小堆排序代码实现时间复杂度空间复杂度 堆排序 堆排序借用的是堆的特性来实现排序功能的。大堆需要满足父节点大于子节点&#xff0c;因此堆顶是整个数组中的最大元素。小堆则相反&#xff0c;要求父节…

opencv和gdal的读写图片波段顺序问题

最近处理遥感影像总是不时听到 图片的波段错了&#xff0c;一开始不明就里&#xff0c;都是图片怎么就判断错了。 1、图像RGB波段顺序判断 后面和大家交流&#xff0c;基本上知道了一个判断标准。 一般来说&#xff0c;进入人眼的自然画面在计算机视觉中一般是rgb波段顺序表示…