C++学习:一个简单适用的跨平台Log类(1)

C++编程之自定义日志类 ——log4cpp使用详解 C++编程之自定义日志类 ——log4cpp使用详解log4cpp简介与安装log4cpp安装log4cpp简单介绍layout布局——日志输出格式log4cpp::BasicLayoutlog4cpp::PatternLayoutappenderlog4cpp::FileAppenderlog4cpp::RollingFileAppenderlog4cpp::OstreamAppenderlog... 阅读详情
本文开发一个简单适用的日志类Log,讲述C++一些比较好玩的特性,template、策略类、多线程锁、单件、函数可变参数等的方法。涉及的东西比较多,可能一篇写不完。


在开始Log类之前,先讲解几个简单的class,这些class往往比较小,完成单一的功能,利用C++多重继承机制,把这些小类拼装成比较复杂的类。这些小class,称为策略类。枯燥无味的概念不是重点,《C++设计新思维》的第一章有详细讲述。我只show代码,用代码说明。


第一个类是NoCopy,字面意思就是让类不能复制,具体的就是不能通过构造函数和赋值函数来构造对象。要达到这个目的,只需要自定义类型从这个类派生即可。原理就是把拷贝构造函数和赋值函数屏蔽掉,叫编译器编译不过。代码如下:

class NoCopy
{
        NoCopy( const NoCopy& );//私有
	NoCopy& operator=( const NoCopy & ); //私有
public:
	NoCopy(void){}//提供缺省的构造函数
};

这里明确定义缺省构造函数,原因是声明了私有的拷贝构造函数和赋值函数,结果缺省构造函数就没了,派生类会出现编译错误,报告NoCopy无缺省构造函数。


第二类是一组类,跟多线程有关。多线程环境下,考虑到并发情况,数据的访问要保证互斥,不能破坏掉。一些伪码如下:

class Something
{
public:
    bool WriteOp(...)
    {
        m_lock.Lock();
        ...
        m_lock.Unlock();
    }
private:
    XxxLock m_lock;//互斥对象
};
为了实现跨平台,所使用的互斥对象,不能依赖具体某个平台,比如win32,而且要求这种加锁机制,由使用者自己决定是否采用。互斥的时候,需要成对使用Lock和Unlock,防止忘记解锁,导致死锁。一个惯用法比较常用,就是利用构造函数和析构函数。首先来看门卫锁,也叫范围锁的类型:

template<typename LockT>
class GuardLock
{
public:
	GuardLock( const LockT &lock)
		:m_lock( const_cast<LockT&>(lock) )
	{
		m_lock.Lock();
	}

	~GuardLock(void)
	{
		m_lock.Unlock();
	}

private:
	LockT &m_lock;
};
GuardLock类型并未对所使用的互斥对象进行限制,通过模板参数来指定。这样可以方便实现跨平台。使用方法如下:

CCriticalSection m_cs;//win32的关键代码段

GuardLock<CriticalSection> lock;
关于锁的类型,在《C++设计新思维》一书中说了主要有三种:

1、空锁,也就是单线程,Lock和Unlock是空操作;

2、对象锁,就是每个对象都有一个互斥对象,加锁针对单个对象;

3、类锁,就是每个类有一个互斥对象,加锁针对类;

三个不同的锁类型,我们可以通过三个小的class来实现,类型只要从这些小class派生,就可以具备不同的加锁保护。首先来看一下空锁的类型定义:

template<class Host>
class EmptyLock
{
public:
	struct Lock
	{
		Lock() {}
		explicit Lock( const EmptyLock& ) {}//子类是父类的关系是:is a
	};
};
上述的模板Host,是指所要定义的派生类。具体的用法,后面再介绍。还有两个类型的锁,定义为:

template<typename Host, typename LockT>
class ObjectLock
{
	LockT m_lock;//普通成员
public:
	ObjectLock()
		:m_lock()
	{
	}
	~ObjectLock()
	{
	}

	class Lock;
	friend class Lock;
	class Lock : NoCopy//嵌套类
	{
		ObjectLock& m_host;
	public:
		explicit Lock(const ObjectLock& host)
			: m_host(const_cast<ObjectLock>(host))
		{
			m_host.Lock();
		}
		~Lock(void)
		{
			m_host.Unlock();
		}
	};
};

template <typename Host, typename LockT>
class ClassLock
{
	static LockT s_classLock;//静态成员
public:
	class Lock;
	friend class Lock;

	class Lock : NoCopy
	{
	public:
		explicit Lock( const ClassLock& )
		{
			ClassLock::s_classLock.Lock();
		}
		~Lock(void)
		{
			ClassLock::s_classLock.Unlock();
		}
	};
};

template <typename Host, typename LockT>
LockT ClassLock<Host, LockT>::s_classLock;//定义静态成员变量

对象锁和类锁的不同地方,就是互斥对象,一个是普通成员变量,一个是静态成员变量,大家都知道,静态成员变量是属于类的,不属于对象。关于对象和类的区别,没有搞明白的,可能需要加深理解。简单的举一个例子,比如狗,狗是类,一只叫小白的狗则是一个对象。现在设计一个类,具备对象锁的互斥能力。代码如下:

class MyClass : public ObjectLock<MyClass, CCriticalSection>
{
public:
    void TestLock(void)
    {
        Lock lock(*this);//这里就是调用具体的加锁函数
        
        //other code;
    }
};
这里使用win32的关键代码段举例子,使得MyClass就不是模板类了。现在MyClass类就具备了对象锁的特性。如果后续需要改成类锁,就只需要改一下类型的声明即可:

class MyClass : public ClassLock<MyClass, CCriticalSection>
{
};

现在,也许大家已经初步见到这些小class(策略类)的作用,通过简单的组建,就可以使得类型具备一些复杂的特性,而改动地方很小。对于一个严肃的开发人员来说,写超过100行的函数,一般会比较小心谨慎的。同样,对于一个类型来说,同样是如此,把一个类型设计成小儿简单的,也是代码设计的基本功,C++远远不是带class的C。


说了这么多,还只是Log类一些准备工作,下一篇再来讲述。

【log4】c++日志工具之——log4cpp 1、log4cpp概述 Log4cpp是一个开源的C++类库,它提供了C++程序中使用日志和跟踪调试的功能,它的优点如下: 提供应用程序运行上下文,方便跟踪调试; 可扩展的、多种方式记录日志,包括命令行、文件、回卷文件、内存、syslog服务器、Win事件日志等; 可以动态控制日志记录级别,在效率和功能中进行调整; 所有配置可以通过配置文件进行动态调整; 多语言支持,包括Java(log4j),C++(log4cpp、log4cplus),C(log4c),python(... 阅读详情

相关推荐

log4cpp 详解及使用操作

Log4cpp是一个开源的C++类库,它提供了在C++程序中使用日志和跟踪调试的功能。使用log4cpp,可以很便利地将日志或者跟踪调试信息写入字符流、内存字符串队列、文件、回滚文件、调试器、Windows日志、本地syslog和远程syslog服务器中。 1、Log4cpp简介   Log4cpp是个基于LGPL的开源项目,移植自Java的日志处理跟踪项目log4j,并保持了API上的一致。...

Zhanganliu的博客 7148

基于C语言实现的跨平台日志系统详解

日志系统的核心功能包括日志初始化:为日志系统指定一个文件路径,用于存储日志信息。日志记录:支持多级别的日志记录,例如调试、信息、警告、错误等。资源释放:在程序结束时关闭日志文件,释放资源。为了使日志系统具有跨平台特性,我们在设计时考虑了Windows和Linux环境的兼容性。本篇博文详细介绍了如何用C语言实现一个跨平台的日志系统,并展示了如何在实际应用中集成和使用该系统。通过日志系统的记录和追踪,开发者可以更好地了解应用的运行状态,快速定位和解决问题。

weixin_52734695的博客 1342

log4cpp 编译与使用

一 引言 Log4cpp是个开源的日志跟踪项目,它是运行在c++环境下的。 由于Java的日志处理跟踪项目log4j的效果很好,所以把它移植到c++,并保持了API上的一致。其类似的支持库还包括C(log4c)、python(log4p)、c#(log4net)等。因为之前使用过log4net,相比之下,感觉log4cpp的使用还是复杂一些。 目前接触到的东西不多,主要使用Log4cpp

xiaocainiao_2015的博客 5393

c++ 自定义Logger 日志类

使用qt界面,接收日志,,通过接收 logReceived 信号,获取日志信息显示。这里QtConcurrent::run 可以方便接收信息,触发异步信号,不阻塞界面。不然界面会卡死,更新UI只能在一个线程中。默认保存到文件,并支持回调函数,比如显示到界面。

weixin_43763292的博客 1732

【log4cpp_学习】3_log4cpp的类介绍

log4cpp

田一一 1485

C++跨平台基于log4cpp二次单例封装

项目因为切换日志库,选型log4cpp,为了使用方便,进行了二次封装 log4cpp.h #ifndef __LOG_4_CPP__ #define __LOG_4_CPP__ #include<iostream> #include <string.h> //strrchr()函数所需头文件 #include <stdio.h> #include &l...

Map的博客 831

一个简单的C++日志系统实现

一个跨平台的日志系统 用法如下 test_log.cpp #include <iostream> #include "log.h" simpleLog::Log *g_p_default_Log = NULL; int main() { static simpleLog::Log mylog("./log/my.log"); g_p_defau...

weixin_30333885的博客 323

log4cpp学习笔记

Log4cppcp的简单介绍

LHJ884的专栏 1566

C/C++编程:log4cpp使用学习

简介 Log4cpp是一个开源的C++类库,它提供了在C++程序中使用日志和跟踪调试的功能。使用log4cpp,可以很便利地将日志或者跟踪调试信息写入字符流、内存字符串队列、文件、回滚文件、调试器、Windows日志、本地syslog和远程syslog服务器中。 Log4cpp有如下优点: 提供了可扩展的多种日志记录方式; 提供了NDC(嵌套诊断上下文),可用于多线程、多场景的跟踪调试; 提供了完整的日志动态优先级控制,可随时调整需要记录的日志优先级 可通过配置文件完成所有配置并动态加载; 性能优秀,内存

OceanStar的博客 4019

C++ log4cpp的使用

C++ log4cpp使用安装需要了解的四个部分(基本的) log4cpp官网 这里整理了需要使用到的基本内容 安装 从官网下载最新的库文件 下载地址 下载的文件名格式为 log4cpp-x.y.z.tar.gz 以下内容均在Linux中完成 版本信息 Linux version 5.3.0-46-generic (buildd@lcy01-amd64-013) (gcc version 7.5...

Zzzz的博客 787

跨平台c++日志类log

跨平台c++日志类log,很多产品级项目都要求在运行时记录日志,方便维护查询。本类是一个很好用的类,支持跨平台。

C++ Log4cpp跨平台日志库使用记录(Window与Linux)

介绍log4cpp的项目用法,将在项目中常用的用法代码写下来分享!

cpp_learner的博客 8036

c++日志类log代码小使用简单跨平台

一个.h文件,封装了日志类,c++跨平台,在很多项目中使用过,使用超级简单。

log4cpp库的使用

log4..简介log4..是基于log4j的一系列的c++移植版本,使用了log4j的模式结构,目前主要有以下几个版本: 1. log4cxx, 目前是到0.10.0版 2. log4cplus,目前最新版本是1.2.0 3. log4cpp,目前最新版本1.1.2

Fei_Liu的博客 5489

2025反爬终极方案:Python破解Cloudflare v2行为指纹,设备伪装+轨迹模拟拦截率压至1%

Cloudflare v2的反爬逻辑越来越接近“人类行为识别”,单纯的技术破解已失效,核心竞争力变成“模拟真实用户的能力”。本文的终极方案本质是“全方位复刻人类行为”——从设备指纹到操作轨迹,从网络特征到交互模式,让爬虫成为“无法被区分的真实用户”。这套方案的优势是“通用性强”,不仅适用于Cloudflare v2,也能破解大多数高反爬网站(如小红书、知乎、跨境电商)的行为检测;且代码可直接复用,新手只需替换目标URL和数据提取逻辑,就能快速落地。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2355

FOC控制必看:单/双/三电阻电流采样方案全对比(附NXP实战避坑指南)

本文深入对比了FOC控制中单电阻、双电阻和三电阻电流采样方案的优劣与适用场景,重点剖析了采样时序、窗口与ADC转换的工程挑战。针对NXP平台,提供了解决采样窗口过窄的实战方案与配置指南,帮助工程师根据成本与性能需求做出最优选择,并规避常见设计陷阱。

n2o3p4的博客 416

Log4cpp介绍及使用

Log4cpp是一个开源的C++类库,它提供了在C++程序中使用日志和跟踪调试的功能。使用log4cpp,可以很便利地将日志或者跟踪调试信息写入字符流、内存字符串队列、文件、回滚文件、调试器、Windows日志、本地syslog和远程syslog服务器中。 1、Log4cpp简介   Log4cpp是个基于LGPL的开源项目,移植自Java的日志处理跟踪项目log4j,并保持了API上的一致。

Ckary的博客 5万+

Python爬虫实战:西瓜视频m3u8解析与FFmpeg下载合并

网络爬虫与流媒体解析是Python工程实践中的常见需求,其核心在于通过HTTP请求获取数据并解析特定格式。m3u8作为HLS协议索引文件,将视频切分为ts分片,便于流式传输。结合FFmpeg的多线程处理能力,可高效完成分片下载与合并,技术价值在于提升视频处理效率。典型应用场景包括视频下载、离线缓存等。本文以西瓜视频为例,详细讲解如何使用requests库提取m3u8地址,并调用FFmpeg批量下载ts分片合并为mp4,涵盖请求伪装、索引解析及常见问题排查。

weixin_31856057的博客 15万+

C++学习笔记(七)——log4cpp

C++学习笔记(七)——log4cpp log4cpp的下载与安装 1.下载log4cpp-1.1.1.tar.gz 2. 安装:先将log4cpp-1.1.1.tar.gz拖入用户主目录, 然后再执行以下步骤: $ sudo cp log4cpp-1.1.1.tar.gz /usr/local $ su # cd /usr/local # tar zxvf log4cpp-1.1.1.tar.g...

weixin_39828926的博客 519

蚁群算法(Ant Colony Optimization,ACO)讲解+代码实现

通常情况下,较优的解对应的路径上的信息素会被加强,而较差解对应的信息素则会减少或蒸发。的化学物质,这种物质会在蚂蚁走过的路径上留下痕迹,后续的蚂蚁会根据这些信息素的浓度来选择路径,从而形成一条从蚁巢到食物源的。在求解TSP蚁群算法中,每只蚂蚁相互独立,用于构造不同的路线,蚂蚁之间通过信息素进行交流,合作求解。的过程,该路段经过的蚂蚁越多,信息素留下的就越多,浓度越高,更多的蚂蚁都会选择这个路段。需要注意的是,蚁群算法是一种。(6)计算每只蚂蚁的总距离:遍历每只蚂蚁的路线,累加经过的城市之间的距离。

m0_73804764的博客 1万+

x86架构学习之中断

外部中断,一般是由CPU的外部引脚电信号触发,这些引脚留给硬件厂商去定义中断,例如主板厂商可以将USB中断挂载70号中断引脚上,MCU厂商可以将片上外设(SPI、I2C等)的中断挂载在指定中断线上。中断描述符主要用于说明该中断的入口地址,中断描述符表则是将中断描述符一项一项管理在一个数组中,每一项中断描述符占用8个字节(64位模式下,占用16字节),其。简称中断,后文如果没特别说明,中断都指外部中断,由外部IO事件触发,由于时钟源来自CPU外部,与CPU时钟不同源,因此是异步事件。

qq_26962739的博客 1572

Log4cpp使用

下载地址:https://github.com/ietjxdl/log4cpp 系统环境:windows 7 32位 开发环境:vs2010 软件版本:log4cpp-1.1.tar.gz   编译 解压log4cpp-1.1.tar.gz到D: \log4cpp,解压缩后在目录下找到log4cpp\msvc10文件夹,进入后打开msvc10.sln工程。该工程下有log4cpp的静态

xinhuo11的专栏 4124

python:实现矩阵SVD分解(附完整源码)

python:实现矩阵SVD分解(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 603

【Log4cpp】项目日志Log4cpp的简单使用

开源的C++类库Log4cpp提供了很多功能,帮助我们的应用程序更方便地记录日志。

半生瓜のblog 932

用python画带有正负值的条形图

常见的条形图只能表现数据的大小,却不能表现值的正负关系。但是其实仅仅使用`pandas`和`matplotlib`两个包就可以实现y轴负轴的添加以及负值的显示,并且可以为正负值分别设置不同的颜色,让条形图看上去更加清晰,易于我们分析

weixin_44853840的博客 5384

高电压技术的面试内容整理(详细版本:57题)

涵盖了高电压技术的关键领域,包括气体放电的物理过程、液体和固体介质的绝缘特性、高压外绝缘的分类与特性、电气设备绝缘试验的方法与原理、电力系统的防雷保护措施,以及内部过电压的产生、影响与限制方法,为理解和应对高电压环境下的电气问题提供了系统的知识框架。通过深入探讨气体放电理论、介质极化与损耗、绝缘子的电气特性、绝缘试验技术、防雷策略以及内部过电压的管理。

weixin_44808274的博客 777
上一篇: C++学习: int2str,int2str类型转换
下一篇: C++学习:通过管道进行cmd进程输入输出重定向
chaos-god
博客等级 码龄20年 39粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值