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.hqwc.cn/news/316879.html

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

相关文章

RKE安装k8s及部署高可用rancher之证书在外面的7层LB(nginx中) 7层负载均衡

一 了解 Rancher 1 推荐架构 安装 Rancher 的方式有两种&#xff1a;单节点安装和高可用集群安装。因为单节点安装只适用于测试和 demo 环境&#xff0c;而且单节点安装和高可用集群安装之间不能进行数据迁移&#xff0c;所以推荐从一开始就使用高可用集群安装的方式安装 Ran…

以角色为基础的软件开发团队建设

角色抽象作为一种载体&#xff0c;可以很好地进行软件工程知识体系和企业知识地图的组织&#xff0c;满足企业知识体系持续改进的需要&#xff0c;因此角色团队组建和建设也可以作为软件工程实施方法之一。 软件开发项目立项时&#xff0c;重要工作之一就是开发团队的组建&…

OpenAI官方发布ChatGPT 提示词指南,六大策略让你玩转大语言模型!

OpenAI前段时间官方放出了自己的提示工程指南&#xff0c;从大模型小白到开发者&#xff0c;都可以从中消化出不少营养。看看全世界最懂大模型的人&#xff0c;是怎么写提示词的。官方给出了6 个大提示策略&#xff1a; 1、清晰的指令&#xff1a; 告诉AI你具体想要什么。比如…

Spring高手之路-Spring中Bean的五大作用域

目录 Singleton&#xff08;单例&#xff09;&#xff1a;默认的作用域 Prototype&#xff08;原型&#xff09; Request&#xff08;请求&#xff09; Session&#xff08;会话&#xff09; Global Session&#xff08;全局会话&#xff09; 五大作用域范围对比 作用域…

LeetCode 2487. 从链表中移除节点:单调栈

【LetMeFly】2487.从链表中移除节点&#xff1a;单调栈 力扣题目链接&#xff1a;https://leetcode.cn/problems/remove-nodes-from-linked-list/ 给你一个链表的头节点 head 。 移除每个右侧有一个更大数值的节点。 返回修改后链表的头节点 head 。 示例 1&#xff1a; 输…

C语言实例_string.h库函数功能及其用法详解

一、前言 在计算机编程中&#xff0c;字符串处理是一项常见而重要的任务。C语言的string.h头文件提供了一系列函数和工具&#xff0c;用于对字符串进行操作和处理。这些函数包括字符串复制、连接、比较、查找等功能&#xff0c;为开发人员提供了强大的字符串处理能力。本文将对…

RK3568驱动指南|第九篇 设备模型-第95章 创建属性文件并实现读写功能实验1

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

子进程继承了内存映射mmap导致flock文件锁泄露

背景 想要利用文件锁在进程退出时自动释放的机制&#xff0c;让守护进程管擦某些资源的释放&#xff0c;并执行相关清理/重启工作。然而发现守护进程在父进程退出时永远饿死。 问题伪代码 主进程子进程 安装信号捕获&#xff0c;每当有信号时print并退出&#xff0c;对子进…

实验笔记之——基于windows复现Instant-NGP

之前博客对NeRF-SLAM进行了调研&#xff0c;本博文先复现一下Intant-NGP。 学习笔记之——NeRF SLAM&#xff08;基于神经辐射场的SLAM&#xff09;-CSDN博客文章浏览阅读851次&#xff0c;点赞22次&#xff0c;收藏21次。NeRF 所做的任务是 Novel View Synthesis&#xff08;…

Git提交代码发生冲突的场景与解决方案

问题 当我们在使用 Git 向远程仓库提交代码时&#xff0c;可能会遇到如下所述的错误提示&#xff1a; To https://github.com/xxxxx/gitmerge.git! [rejected] master -> master (fetch first) error: failed to push some refs to https://github.com/xxxxx/gitme…

CMake入门教程【核心篇】编译类型Debug、Release、MinSizeRel、RelWithDebInfo

文章目录 1.说明1.1 Debug 配置1.2 Release 配置1.3 MinSizeRel 配置1.4 RelWithDebInfo 配置 2.提供的编译类型3.示例结论 1.说明 CMake作为一款强大的构建系统&#xff0c;提供了多种编译配置选项。这些配置影响编译过程中的优化级别和调试信息的包含情况。以下是CMake提供的…

成功的交易员是如何走向成熟的?

如果不能严格遵守纪律&#xff0c;你可能会犯下10000种错误&#xff1b;但是&#xff0c;如果你能够严格的遵守纪律&#xff0c;你就一个错误都犯不了。 本文为大家讲讲交易员进阶的五个阶段&#xff0c;希望大家能有所收获哦&#xff01;~ 一、掌握技术分析基础 当你刚开始接触…