Welcome

首页 / 软件开发 / C++ / 通用的应用程序高级日志系统

通用的应用程序高级日志系统2011-02-04 VCKBASE Alex Kucherenko日志模块

本文介绍的日志系统包括七个 C++ 类:CLog, CFuncLog, IStoreLog, CWinLog, CFileLog, CAutoCritic, CLogSimpleLock。CLog 是所有日志模块中最主要的一个类,在大多数情况下,这个类在应用程序中最好是单实例的。但并不是必须的。重要性其次的一个类是 CFuncLog,这个类用于对函数调用的进入和退出进行记录。当然开发人员也可以使用这个类对任何数据进行日志记录。该类重载了 << 操作符,所以使用很方便。

下图是本文介绍的日志系统使用截图

日志模块的 UML 设计

从下图可以看到,日志模块类可以分成两个部分:

1. Storage 类 —— 存储类

2. Logging 类 —— 日志类

图一 UML 设计的类继承图

存储类:

IStoreLog 类的声明

/////////////////////////////////////////////////////////
// 此类是为一个抽象类,建立三个默认的函数,以便支持所有子类,
// 任何子类都必须支持缓冲和非缓冲存储
/////////////////////////////////////////////////////////
class IStoreLog
{
public:
virtual ~IStoreLog( void ){}; // 虚拟析构函数
virtual int FlushData() = 0;
virtual int WriteString( const std::string &Message ) = 0;
virtual int SetBufferLimit( long lSize ) = 0;
};

存储类能对数据缓冲进行清扫处理,缺省情况下,该类在自己的缓冲中存储数据,并且只有调用 FlushData 函数才能将缓冲数据定向到磁盘或其它地方。一般情况下,存储类的缓冲受系统资源的限制,当缓冲达到限制时它会自动进行清理。建立缓冲限制使用 SetBufferLimit 函数。默认情况下,存储类实现必须要分配缓冲并只能用 SetBufferLimit 函数改变缓冲的大小。

存储类使用 WriteString 函数来存储串。所以它既可以存储格式化串,也能存储原始非格式化数据。