C++项目开发之日志模块(一)

最近有点时间可以整理一下前段时间做的项目。项目本身是基于VC的,ATL框架下做COM组件开发。因为项目涉及的内容很杂,所以只能具体问题具体分析,具有普遍性的问题还是需要拿出来总结一下的。

关于日志。这个问题在项目初期的时候没有约定好,成了以后的一个大问题。最初考虑到项目的成果都是组件,每个组件只要测试维护好自己的功能就可以,没有过多的强调日志模块的作用,后期试生产和调试过程因此产生了很多不必要的麻烦。

项目初期的设计阶段,我们作了一些比较细致的需求分析,因为每个组件的功能划分的非常清楚,而且每个组件的开发维护可以具体到人,所以公共模块的划分比较模糊。当然通常情况下如果我们设计的是一个系统,可能对于系统分层以及模块的划分会比较清楚,和这个情况不同,项目本身的各组件之间初期联系很少,而且功能比较单一和独立,想当然的就缺少了整体的考虑,而是每个组件自己做自己的,不过对于中小规模的开发这样做未尝不可。

项目中期阶段,问题开始显现,原定的项目计划因为用户的需求改变,有所调整,很多与核心组件有关,但关系不大的功能开始交织进来。第一个问题,需要加入的功能很多,功能之间有叠加了。第二个问题,非常强调组件的性能了。第三个问题,第三方组件在数据压力下不稳定了。这些问题可以说是我们项目初期设计上的考虑不足,本以为是个小项目,最后小项目要大做了。作为系统开发人员也得硬着头皮上了。

功能复杂后,初期的设计不能满足需求,那就必须重构了,此处就不多说了。这里强调的是日志模块,日志功能可以归入常用功能,可以不局限当前项目,如果做得好可以在很多项目中通用。今年年初参加设计方面的培训,统计一下常用功能,发现很多公司能通用的功能很多很杂,但是最通用的就是日志功能。不要小看日志,日志对于系统大问题的解决作用很大。有经验的开发人员可以通过日志评估当前系统的状态。对于当前项目的后两个问题,性能和不稳定,最好的分析方法就是日志。

组件性能在日志中如何体现?对于web开发可能有很多第三方工具做测试,而对于服务器中数据处理和计算的跟踪最好的方法仍然是日志,比如针对某种类型的数据,需要调用某种组件单独处理,组件调用后具体花了多长时间处理呢?用户可以不知道这些,但是对于系统开发和维护人员这些都必须了然于胸。通过日志,记录下关键任务的执行细节,都很重要。

跟踪不稳定模块,日志起到的作用更强大。事实上不稳定的组件最后导致的结果必然是结果不正确或者系统崩溃,结果不正确,可以通过详细的调试过程来完善,系统崩溃就不好解决了。很多时候即使能确定哪个组件导致的,可是仍然无法断言问题出在哪,而如果有了日志,这个问题也能迎刃而解。

自己写还是用其他的?建议还是用比较好的开源。自己写着试试可以,但是自己写的好不好是要打问号的,因为做日志不只是打开文件写内容那么简单,具体的输出设备要不要考虑,信息如何分类,结构如何松散通用?我也自己写过(5年C++经验),但是从通用和易用上感觉还是不怎么好用,所以建议用比较牛X的开源比较好,一方面是学习,一方面也比较强壮。

我初期试用的是log4cPlus,说实话,这个开源组件水平还是一般,在linux和window下,以及多款c++开发平台下测试,容易出问题(崩溃,内存问题),强烈不推荐。最近在用log4cxx,这个是Apache的开源,非常好,大小项目都能用,非常推荐使用。只是编译比较费劲。编译完了,后面的使用就顺利了,强烈建议C++用户使用,跨平台,支持多线程等优势。其他的几款效果都一般,google的开源日志也行,只是安装和使用都比较复杂。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QT版本 //xxxx.h //log level #define LL_DEBUG 0 #define LL_INFO 1 #define LL_WARN 2 #define LL_ERROR 3 #define LL_ALARM 4 #define GetCurFileName (__FILE__) #define GetCurCodeLine (__LINE__) #define GetCurCodeFunctionName (__FUNCTION__) #define Write_Log(LEVEL, FMTLOG) WriteLog(LEVEL, FMTLOG, GetCurFileName, GetCurCodeLine, GetCurCodeFunctionName) void WriteLog(int, QString, QString, int, QString); //xxxx.cpp void WriteLog(int loglevel, QString strlogstr, QString strfilename, int iline, QString strfunname) { QString g_logdllpath(g_runPath + "/dependences/LoggingModeDLL.dll"); HINSTANCE hDll = LoadLibrary(g_logdllpath.toStdWString().data()); typedef int (__cdecl *MYFUNC)(int, char*, char*, int, char*); MYFUNC execfunc = (MYFUNC)GetProcAddress(hDll, "WriteLog"); execfunc(loglevel, const_cast<char*>(strlogstr.toLatin1().data()), const_cast<char*>(strfilename.toLatin1().data()), iline, const_cast<char*>(strfunname.toLatin1().data())); } MFC 版本 //xxxx.h //log level #define LL_DEBUG 0 #define LL_INFO 1 #define LL_WARN 2 #define LL_ERROR 3 #define LL_ALARM 4 #define GetCurFileName (__FILE__) #define GetCurCodeLine (__LINE__) #define GetCurCodeFunctionName (__FUNCTION__) #define Write_Log(LEVEL, FMTLOG) WriteLog(LEVEL, FMTLOG, GetCurFileName, GetCurCodeLine, GetCurCodeFunctionName) void WriteLog(int, CString, CString, int, CString); void WriteLog(int loglevel, CString strlogstr, CString strfilename, int iline, CString strfunname) { CString g_logdllpath(".\\LoggingModeDLL.dll"); HINSTANCE hDll = LoadLibrary(g_logdllpath.GetBuffer()); typedef int (__cdecl *MYFUNC)(int, char*, char*, int, char*); MYFUNC execfunc = (MYFUNC)GetProcAddress(hDll, "WriteLog"); execfunc(loglevel, const_cast<char*>(strlogstr.GetBuffer()), const_cast<char*>(strfilename.GetBuffer()), iline, const_cast<char*>(strfunname.GetBuffer())); }
### 回答1: 轻量化插件开发框架C,是一种基于C语言的插件开发框架,旨在提升插件开发的效率和可扩展性。该框架的核心思想是将插件拆成多个小模块,并通过一个轻量级的内核将它们集成在一起。 使用该框架进行插件开发,可以轻松地实现插件的加载和卸载,同时也能方便地管理插件之间的依赖关系。此外,该框架还支持插件之间的消息传递和事件通知,使得插件之间的协作更加简单和高效。 值得特别强调的是,该框架的轻量化设计非常符合现代软件开发的趋势,不仅具有出色的性能和稳定性,还具备很高的可移植性和可复用性。因此,无论是开发单机软件还是分布式系统,使用该框架都能够大大简化开发流程,提高开发效率。 总之,轻量化插件开发框架C是一项非常有价值的技术,为插件开发者提供了一个高效、稳定、可扩展的开发环境。随着越来越多的软件系统开始采用插件化架构,该框架在未来的发展中将扮演着越来越重要的角色。 ### 回答2: 轻量化插件开发框架是一种基于C语言的开发工具,旨在提供一套简单易用的开发平台,用于开发轻量级插件。它的主要特点是代码轻量级,模块化设计,易于扩展和定制化。 轻量化插件开发框架C是针对嵌入式系统等资源受限环境而设计的,具有小巧、高效、灵活等特点。它可以帮助开发者快速地创建功能齐全、可定制的插件。同时,它也提供了一些常用的插件服务,如配置管理、日志记录、网络通信等,开发者可以直接调用这些服务,从而减少开发的工作量。 使用轻量化插件开发框架C,开发者可以快速构建插件,并通过模块化的方式管理代码,便于维护和扩展。此外,由于轻量化插件开发框架C采用了C语言作为开发语言,它可以与其他C语言开发项目无缝集成,方便开发者利用现有的代码资源,减少重复开发的工作。 总而言之,轻量化插件开发框架C是一种高效、灵活、易于扩展的开发工具,具有小巧、高效、模块化设计等特点,能够帮助开发者快速构建插件,并使其更易于维护和扩展。 ### 回答3: 轻量化插件开发框架C是一种基于C语言的轻量级软件开发框架,旨在优化软件开发的效率并减少开发成本。该框架主要用于为主流操作系统和软件平台开发各种类型的插件和模块,包括嵌入式应用程序、浏览器插件、GUI插件、游戏插件、多媒体插件、系统工具和驱动程序等。其本质是一个用于插件开发的API集合,它提供了一种标准化的方式,使应用程序能够通过简单的接口调用来访问各种插件。 轻量化插件开发框架C的主要优点是灵活性和可扩展性。它可以被轻松地集成到任何C/C++软件项目中,并且通过支持各种自定义插件类型和数据格式,可以满足几乎所有开发需求。此外,该框架还具有开发周期短、代码量少、运行速度快等特点,这使得它成为开发人员首选的插件开发框架之一。 轻量化插件开发框架C的实现需要遵循一些核心原则。首先,插件必须尽可能简单,接口必须明确,以确保插件可以灵活地进行配置和管理。其次,框架必须提供一些必要的运行时功能,如内存管理、日志分发、线程池等,以保证插件的运行稳定性和可靠性。最后,插件必须高度可扩展,以支持各种新的插件类型、数据格式和操作系统平台。 总之,轻量化插件开发框架C是一种高效、灵活和易于使用的插件开发框架,它可以大大提高软件开发的效率和质量,适用于各种大小规模的软件项目

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值