自己写的一个基于C++的跨平台的轻量级日志类
2012-01-29 17:11
399 查看
写在最前:该日志类的所有源代码可至http://download.csdn.net/detail/great3779/4034521免费下载。
目前C++下比较常用的日志类是log4cpp。这是一个大而全的日志类,提供了很多的功能和扩展。但其缺点是使用起来比较繁杂,而且携带的库也比较大。因此有时我们希望使用一些轻量级的、接口简单易用的日志库。基于此目的,我自己开发了一个轻量级跨平台的日志类。目前使用在Wind FeedHandler项目中做为日常日志输出。除了写日志的基本功能外,该类也展示了以下几个方面的内容:
(1). 多线程写日志的思想。(写日志的动作不应对主程序产生较大影响)
(2). 展示了跨平台的线程安全、信号通知等机制
(3). 展示了一个高效的数据处理器
(4). 展示了回调机制的使用
(5). 展示了单例的使用
(6). 间接展示了模板类的使用
一。该类的接口非常简单
SetLogPath在开始写日志前调用,主要是设置log文件的存放路径及log文件名(即设置log文件的绝对路径)。需要注意的是日志类会自动按照日期对日志文件命名,即如果在SetLogPath接口传入的文件名为run.log, 则实际的log文件名形如 run20110910.log。同时接口允许设置一个回调函数LOG_CALLBACK_FUNC 用于回调日志类的内部运行状态。
AddLog则是添加一条日志。LOG_LEVEL允许设置日志的级别,默认是普通级别。
二。日志类的内部运转非常简单,主要是借助了之前提到的数据处理器(可参考/article/1432955.html)进行运转。
三。该日志类的使用也非常简单。
由于日志的特殊性,在设计时将此日志类设计成单例模式。使用如下
// 回调函数定义如下
目前C++下比较常用的日志类是log4cpp。这是一个大而全的日志类,提供了很多的功能和扩展。但其缺点是使用起来比较繁杂,而且携带的库也比较大。因此有时我们希望使用一些轻量级的、接口简单易用的日志库。基于此目的,我自己开发了一个轻量级跨平台的日志类。目前使用在Wind FeedHandler项目中做为日常日志输出。除了写日志的基本功能外,该类也展示了以下几个方面的内容:
(1). 多线程写日志的思想。(写日志的动作不应对主程序产生较大影响)
(2). 展示了跨平台的线程安全、信号通知等机制
(3). 展示了一个高效的数据处理器
(4). 展示了回调机制的使用
(5). 展示了单例的使用
(6). 间接展示了模板类的使用
一。该类的接口非常简单
// 添加日志 void AddLog(std::string strLog, LOG_LEVEL log_level = NORMAL_LOG); // 设置日志文件存放路径 // pfunc为回调函数,用于展示Log内部状态 void SetLogPath(const std::string& file_path, LOG_CALLBACK_FUNC pfunc = NULL);其中
SetLogPath在开始写日志前调用,主要是设置log文件的存放路径及log文件名(即设置log文件的绝对路径)。需要注意的是日志类会自动按照日期对日志文件命名,即如果在SetLogPath接口传入的文件名为run.log, 则实际的log文件名形如 run20110910.log。同时接口允许设置一个回调函数LOG_CALLBACK_FUNC 用于回调日志类的内部运行状态。
AddLog则是添加一条日志。LOG_LEVEL允许设置日志的级别,默认是普通级别。
二。日志类的内部运转非常简单,主要是借助了之前提到的数据处理器(可参考/article/1432955.html)进行运转。
class CLogDataHandler : public CDataHandler<std::string> { public: CLogDataHandler(void); virtual ~CLogDataHandler(void); public: void SetLogObj(CLog* ptr_log) {m_ptr_log = ptr_log;} protected: // 处理数据的函数,可在运行时绑定 virtual void DataFunc(std::string& t); protected: CLog* m_ptr_log; };派生类CLogDataHandler继承自虚类CDataHandler,屏蔽了线程安全以及信号通知机制。使得日志类能轻松做到线程安全及高效吞吐。
三。该日志类的使用也非常简单。
由于日志的特殊性,在设计时将此日志类设计成单例模式。使用如下
// 设置日志路径。支持相对/绝对/网络路径 CLog::Instance().SetLogPath("log\\log.log", MsgFunc); // 添加一条日志 CLog::Instance().AddLog("test_log");
// 回调函数定义如下
void MsgFunc(int status, std::string msg) { cout << msg << endl; }
相关文章推荐
- ISE(Iris Server Engine)是一个基于现代C++的跨平台(Linux和Windows)框架
- 一个跨平台的 C++ 内存泄漏检测器
- C++第5周任务【任务2】本任务将设计一个简单的分数类,完成对分数的几个运算。一则巩固基于对象编程的方法,二则也为第10章做运算符重载等积累些感性认识。
- C++ 单例模式中处理在类中声明一个指向一个自己的指针,在编译时显示定义的指针未定义的处理办法
- 基于模板元编程技术的跨平台C++动态链接加载库
- 自己模仿QQ基于Java Swing做的一个QQ界面
- C++ 智能指针的一个实现(基于模板和Shared_ptr)
- 分享一个自己写的基于JQuery的一个Web背景切换的Demo
- (转载)你好,C++(27)在一个函数内部调用它自己本身 5.1.5 函数的递归调用
- C/C++连接数据库MySQL(自己写的一个通讯录软件,供大家学习交流)
- 基于C++的跨平台的轻量级日志类
- 一个跨平台的 C++ 内存泄漏检测器
- 发布一个基于 Reactor 模式的 C++ 网络库
- 自己早期做的一个基于j2me的魔塔
- 发布一个基于 Reactor 模式的 C++ 网络库
- 一个跨平台的 C++ 内存泄漏检测器
- Wizard Framework:一个自己开发的基于Windows Forms的向导开发框架
- Qt,一个跨平台的C++应用程序程序开发框架
- 花了差不多一个半小时写了一个基于C++的链表程序,现在发上来,大家多给点意见啊
- C++易混知识点4: 自己编写一个智能指针(Reference Counting)学习auto_ptr和reference counting