自己写的一个基于C++的跨平台的轻量级日志类

写在最前:该日志类的所有源代码可至http://download.csdn.net/detail/great3779/4034521免费下载。


目前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允许设置日志的级别,默认是普通级别。


二。日志类的内部运转非常简单,主要是借助了之前提到的数据处理器(可参考http://blog.csdn.net/great3779/article/details/7180383)进行运转。

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;
}




你可能感兴趣的:(多线程,C++,String,Class,callback,跨平台)