推荐一个很好用的程序日志类Clog

程序员都知道,如果一个比较大型的程序突然奔溃了,那么怎么样快速的分析出问题的所在呢?一个很有效的方法就是查看程序运行日志,看看操作者究竟对程序做了哪些操作,以至于程序奔溃。今天在这里推荐一个很好用的文件日志类Clog,该类来自于Codeprojct,可自行去搜索下载,这里我简单的说明下怎么使用。

演示程序框架

上面是演示程序的基本框架,演示程序是基于对话框的,在程序的全局类theApp类中加入了Log文件类,并提供日志类接口writeLog函数,在对话框类中重载了PreTranslateMessage函数,这样就可以监视所有由对话框类发出的消息,在该函数里调用日志函数,就可以记录下所有程序的操作,下面简单介绍一下演示程序开发流程。

  一、新建一个基于对话框的工程testlog,在对话框里面随意添加一些基本控件。

二、将日志文件类导入到工程中。

由于我的日志文件类不在该程序的目录下,所以要在工程属性中添加格外的路径:

三、在theApp类中添加日志接口函数writeLog()。

//1)添加日志文件头文件包含
#include "Log.h"            // 添加头文件
//2)在类中添加日志文件类以及函数声明
private: 
	CString m_strPath;  // log 文件路径
	CFileLogAppender * m_pLogAppender;  
	CLog* m_pLog;      //log文件类
	CCriticalSection m_SectionLog;  //为了让log函数同时只能一次触发
public:
	bool writeLog(nsCLog::eSeverity severity, CString message);	
//3)在theApp类构造函数中添加类初始化说明
    m_strPath=GetApplicationPath();
	m_strPath+=_T("\\log\\testlog");
	m_pLogAppender=new CFileLogAppender(nsCLog::info, m_strPath.GetBuffer());
	m_pLog=new CLog(_T("administrator"));
	m_pLog->addAppender(m_pLogAppender);
	writeLog(nsCLog::info,"begin log");
	m_strPath.ReleaseBuffer();

//4)添加函数writeLog定义
bool CtestlogApp::writeLog(nsCLog::eSeverity severity, CString message) 
{
	m_SectionLog.Lock();
	if( m_pLog != NULL)
	{
		m_pLog->writeFileLog(severity,message);
	}
	m_SectionLog.Unlock();
	return true;
}
//这个函数可以在程序的任何地方调用!

四、在对话框类中重载PreTranslateMessage,记录程序操作。

  • void AddLog(UINT nCode,UINT nID); //添加log日志函数
  • 重载PreTranslateMessage函数并将鼠标左键单击按下消息以及按键按下消息截取,然后调用AddLog函数将操作记录下来,下面是实现:
BOOL CtestlogDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class

	UINT nID = ::GetDlgCtrlID(pMsg->hwnd); 
	UINT nChar=pMsg->wParam;
	CString strValue;
	bool bInput=false;
	GetDlgItemText(nID,strValue);

	if (pMsg->message==WM_LBUTTONDOWN) //左键单击
	{
		AddLog(pMsg->message,nID);
	}

	if (pMsg->message==WM_KEYDOWN)  //键按下
	{		
		if(GetDlgItem(nID) != NULL 
			&& GetDlgItem(nID)->IsKindOf(RUNTIME_CLASS(CButton))
			&& (pMsg->wParam == VK_SPACE || pMsg->wParam == VK_RETURN))
		AddLog(pMsg->message,nID);
	}
	return CDialog::PreTranslateMessage(pMsg);
}

编译运行之后随便点击对话框里的各种控件,在程序运行目下下的日志文件中就可以看到被记录下来的各种操作,如下图:

程序运行后,可以看到Log文件记录了对程序进行的左右操作。

本演示程序在XP环境下,VS2008下开发,如果有需要在以下网址下载,免注册:http://qiannao.com/file/keji1991/21b6774b/