一个简单又高效的日志系统
2009-05-18 20:06:14 来源:WEB开发网CSuperLog::CSuperLog(void)
{
// 初始化临界区变量
InitializeCriticalSection(&m_csWriteLog);
// 启动信息
m_strWriteStrInfo = WELCOME_LOG_INFO;
// Create the Logger thread.
m_hThread = (HANDLE)_beginthreadex( NULL, 0, &LogProcStart, NULL, 0, &m_uiThreadID );
}
unsigned __stdcall CSuperLog::LogProcStart( void* pArguments )
{
int nCount = 1;
do
{
Sleep(300);
if (++nCount % 10 == 0 )
{
WriteLog(strTemp, ENUM_LOG_LEVEL_ERROR, true); // 每隔三秒写一次日志
}
} while (m_bRun);
}
采有一个全局日志类变量,在构造函数中启动线程,线程每隔三秒去刷新一次文件。
二、日志级别可动态调整
程序的日志一般会进行日志分类,比如说日志级别一般会有调试日志,运行日志,错误日志等分类。在程序发布后运行时一般都会设置在运行日志级别,这时程序中的调试日志就不会被打印出来。如果程序运行中需要定位分析问题时,又需要把日志级别调低,把一些调试信息打印出来。见如下程序实现:
int CSuperLog::WriteLog(CString &strLog,enLogInfoLevel enLevel/* = ENUM_LOG_LEVEL_RUN*/, bool bForce /*= false*/)
{
if (enLevel < m_iLogLevel)
{
return -1;
}
。。。
}
对于调整日志级别,我没有把实现放在调用者去设置。而是把这个日志级别信息存放在共享内存中,如果要调整日志级别,则需要一个小工具去改那一个共享内存。实际上在整个设计中我一直想把日志系统设计得更独立一点,尽量不和外部调用程序有更多牵连。
更多精彩
赞助商链接