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()返回的是静态成员指针,所以不需要每次用完都释放,可以在程序退出时释放一次就可以了。

完!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

以STM32为例,实现按键的短按和长按

以STM32为例&#xff0c;实现按键的短按和长按 目录 以STM32为例&#xff0c;实现按键的短按和长按1 实现原理2 实现代码3 测试结束语 1 实现原理 简单来说就是通过设置一个定时器来定时扫描几个按键的状态&#xff0c;并分别记录按键按下的持续时间&#xff0c;通过时间的长短…

百度百科词条创建多久可以通过?

一个优质的百度百科词条&#xff0c;能提升个人或企业的品牌形象。因此&#xff0c;越来越多的人希望创建自己的百度百科词条&#xff0c;那么&#xff0c;创建一个百度百科词条到底需要多久才能通过审核呢&#xff1f;接下来伯乐网络传媒就来给大家分享一下。 一、百度百科词条…

【Qt之Quick模块】7. Quick基础、常用组件Item、Rectangle、Text、TextInput、TextEdit等

1. 概述 Qt Quick模块是编写QML应用程序的标准库。Qt QML模块提供QML引擎和语言基础结构&#xff0c;Qt Quick模块提供用QML创建用户界面所需的所有基本类型。它提供了一个可视化画布&#xff0c;包括用于创建和动画化可视化组件、接收用户输入、创建数据模型和视图以及延迟对…

静态网页设计——海贼王

前言 使用前端经典三件套HTMLCSSJS实现的海贼王静态网页课程设计&#xff0c;适合我们的童年&#xff01; 主要内容 首页 首页最上方有一个轮播图&#xff0c;可以自动切换图片&#xff0c;使用js实现。 轮播图往下&#xff0c;就是列出一些比较经典的海贼王影片&#xf…

2023年度最热 AI 应用 TOP 50,除了 ChatGPT 还有这么多宝藏

原文章链接&#xff1a;年度最热 AI 应用 TOP 50&#xff0c;除了 ChatGPT 还有这么多宝藏 - IT之家 更多消息&#xff1a;AI人工智能行业动态&#xff0c;aigc应用领域资讯 在 AI 工具激烈竞争的一年中&#xff0c;尽管ChatGPT在访问量上遥遥领先&#xff0c;但单次使用时长未…

Python之字符编码汇总

一、常见编码 ASCII&#xff1a;ASCII码即美国标准信息交换码(American Standard Code for Information Interchange)。由于计算机内部所有信息最终都是一个二进制值&#xff0c;而每一个二进制位&#xff08;bit&#xff09;有0和1两种状态&#xff0c;因此八个二进制位就可以…

gookit/color - Go语言命令行色彩使用库教程

gookit/color - Go语言命令行色彩使用库教程 1.安装2.基础颜色(16-color)3.256色彩/RGB风格 1.安装 go get github.com/gookit/color2.基础颜色(16-color) 提供通用的API方法&#xff1a;Print Printf Println Sprint Sprintf 1、例如&#xff1a; color.Yellow.Println(&q…

centos7 ping不通域名

如果ip能ping通&#xff0c;ping不通域名可以试试以下操作&#xff1a; 1.编辑resolv.conf文件 vi /etc/resolv.conf 添加 nameserver 8.8.8.8 2.编辑nsswitch.conf vi /etc/nsswitch.conf 改成下图所示&#xff1a; 3.编辑sysctl.conf vi /etc/sysctl.conf 加上两行内…

macOS跨进程通信: FIFO(有名管道) 创建实例

一&#xff1a; 简介 在类linux系统中管道分为有名管道和匿名管道。两者都能单方向的跨进程通信。 匿名管道&#xff08;pipe&#xff09;: 必须是父子进程之间&#xff0c;而且子进程只能由父进程fork() 出来的&#xff0c;才能继承父进程的管道句柄&#xff0c;一般mac 开发…

1分钟生成爆款风景视频,Stable Video Diffusion最简教程

AI视频是2024年的重头戏&#xff0c;各大AI厂商都在跑视频技术&#xff0c;快速推出更牛的黑科技&#xff0c;SD其实在11月底就出了一款官方视频大模型-SVD&#xff0c;来跟runway、pika抢这块大蛋糕。 之前生成的视频效果还不是很理想&#xff0c;远没runway效果好&#xff0c…

【Mybatis】深入学习MyBatis:高级特性与Spring整合

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; Mybatis ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 高级特性 1 一级缓存和二级缓存 一级缓存 二级缓存 2 延迟加载 5 整合Spring 1 MyBatis-Spring模块 2 事务管理 结…

如何在Windows安装Wnmp服务并实现固定地址远程访问

文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 WNMP是Windows系统下的绿色NginxMysqlPHP环境集成套件包&#xff0c;安装完成后即可得到一个Nginx MyS…

无辅源电压继电器 RWY-D2/3 180-440VAC 导轨安装 josef约瑟

RWY-D1型电压继电器&#xff1b; RWY-D2型电压继电器&#xff1b; 一、 概述 RWY-D系列电压继电器&#xff08;以下简称本继电器&#xff09;用于发电机、变压器和输电线的电器保护装置中&#xff0c;作为过电压保护或低电压闭锁的启动原件。本继电器为集成电路静态型继电器…

用户管理第2节课 -- idea 2023.2 创建表--鱼皮

二、【先确定idea版本&鱼皮是否一致&#xff0c;再决定看不看这行】建表 2.1 idea 里连接数据库&#xff0c;通过可视化建表 2.1.1 清空表中数据 的 命令 truncate 清空 2.1.2 先输入删除表&#xff0c;的命令&#xff0c;再选中这行命令&#xff0c;执行&#xff0c;…

Linux学习之系统编程2(关于进程及其相关的函数)

写在前面&#xff1a; 我的Linux的学习之路非常坎坷。第一次学习Linux是在大一下的开学没多久&#xff0c;结果因为不会安装VMware就无疾而终了&#xff0c;可以说是没开始就失败了。第二次学习Linux是在大一下快放暑假&#xff08;那个时候刚刚过完考试周&#xff09;&#xf…

k8s快速搭建

VMware16Pro虚拟机安装教程VMware16.1.2安装及各版本密钥CentOS7.4的安装包:提取码&#xff1a;lp6qVMware搭建Centos7虚拟机教程 搭建完一个镜像 关机 拍摄一个快照,克隆两个作为子节点 0. 环境准备 在开始之前&#xff0c;部署Kubernetes集群机器需要满足以下几个条件&#…

实验三-HBase数据库操作

第一步&#xff1a;首先登陆ssh&#xff0c;之前设置了无密码登陆&#xff0c;因此这里不需要密码&#xff1b;再切换目录至/usr/local/hadoop &#xff1b;再启动hadoop ssh localhost cd /usr/local/hadoop ./sbin/start-dfs.sh 输入命令jps&#xff0c;能看到NameNode,Data…

环境准备-VMware安装

照顾到很多人不是很会环境搭建,我这里会将搭建的步骤讲的细致点 第一步,VMware下载。目的是通过VMware搭建Linux服务器,因为大家大部分还是Windows的电脑,我们先下载虚拟机搭建一个Linux系统的服务器 下载完成之后,点击安装,如下: 点击“下一步” 勾选“我接受许可协议…

算法导论复习——CHP24 单源最短路

单源最短路径问题&#xff1a; 给定一个图G (V,E)&#xff0c;找出从给定的源点s∈V到其它每个结点v∈V的最短路径。 这样最短路径具有最优子结构性&#xff1a;两个结点之间的最短路径的任何子路径都是最短的。 基本概念 负权边&#xff1a;权重为负值的边称为负权重的边。 如…

AI计算,为什么要用GPU?

今天这篇文章&#xff0c;我们继续来聊聊芯片。 在之前的文章里&#xff0c;小枣君说过&#xff0c;行业里通常会把半导体芯片分为数字芯片和模拟芯片。其中&#xff0c;数字芯片的市场规模占比较大&#xff0c;达到70%左右。 数字芯片&#xff0c;还可以进一步细分&#xff0…