65.9K
CodeProject 正在变化。 阅读更多。
Home

用于创建跟踪日志的类

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.88/5 (10投票s)

1999年11月18日

1分钟阅读

viewsIcon

104341

downloadIcon

2273

用于创建跟踪日志的类。

引言

调试版运行良好,但发布版崩溃?或者程序在你的电脑上运行正常,但在客户的电脑上崩溃?你需要向发布版添加跟踪功能。

CLogTrace 是一个类,允许你轻松地向程序的发布版添加跟踪功能。你可以让程序在程序的各个阶段将文本行写入日志文件。你提供代码来打开或关闭日志记录。就像使用 TRACE 宏一样,你将获得一个文本文件,其中包含有关调用了哪些函数的日期/时间戳。 只是你可以在发布版中获取这些信息。

该类易于使用。

  1. static CLogTrace 对象作为应用程序类的一个成员。
  2. 在程序的 InitInstance 函数中添加初始化行。
  3. 每当你想要写入日志文件时,使用 CLogTrace::WriteLine 函数 - 这些函数将连同日期和时间一起写入文本。

这是一个示例日志文件输出

11/4/99 10:16:44 PM	Started the application
11/4/99 10:16:44 PM	Created doc template
11/4/99 10:16:44 PM	CDoc constructor
11/4/99 10:16:44 PM	Precreate window
11/4/99 10:16:44 PM	Precreate window
11/4/99 10:16:44 PM	CView Constructor
11/4/99 10:16:44 PM	CView::Precreate window
11/4/99 10:16:44 PM	Created main window
11/4/99 10:16:44 PM	Created tool bar
11/4/99 10:16:44 PM	Created status bar
11/4/99 10:16:44 PM	OnNew Document
11/4/99 10:16:44 PM	Leaving InitInstance
11/4/99 10:16:46 PM	Leaving the application

这是类接口

////////////////////////////////////////////////////////////////////////
//  LogTrace.cpp -- Interface for the CLogTrace class
//  A class to do debug logging

#ifndef __LOGTRACE_H__
#define __LOGTRACE_H__

class CLogTrace
{
// Construction/Destruction
public:
	CLogTrace();
	~CLogTrace();

// Attributes
public:
	CString m_strAppName;

protected:
	BOOL m_bActive;
	CString m_strFileName;
	BOOL m_bTimeStamp;

// Operations
public:
	void WriteLine(LPCTSTR szLine);
	void WriteLine(LPCTSTR szFormat, LPCTSTR szAddInfo);
	void WriteLine(LPCTSTR szFormat, int nAddInfo);
	void ResetFile();
	void OnStartup(BOOL bActive, BOOL bTimeStamp);
	void SetFileName(LPCTSTR szFileName);

protected:

// Inlines
public:
	inline void SetActive(BOOL bSet)
	{
		m_bActive = bSet;
	}
	inline CString GetFileName()
	{
		return m_strFileName;
	}
};

#endif // __LOGTRACE_H__

这是类实现

////////////////////////////////////////////////////////////////////////
//  LogTrace.cpp -- Implementation of the CLogTrace class

#include "stdafx.h"
#include "LogTrace.h"

/**************************************************

 How to use CLogTrace

	1.  Make a static CLogTrace object as a member of the application class
	2.	Add the following lines to the InitInstance of the program
	
	m_LogTrace.m_strAppName = "MyApp"; // use appropriate name here
	m_LogTrace.SetFileName("Log.txt"); // sets the log file name and puts it in the exe path
	m_LogTrace.OnStartup(TRUE, TRUE); // activates the log trace

	3.  Also in InitInstance, add the following line if you want to empty the log file
	each time the application starts
	m_LogTrace.ResetFile();

	4.  Any time you want to write to the log file, use the CLogTrace::WriteLine functions
	these will write the text along with date and time

*******************************************************/

//////////////////////////////////////////////////////
//  Construction/Destruction

CLogTrace::CLogTrace()
{
	m_bActive = FALSE;
	m_bTimeStamp = TRUE;

	CString s;
}

CLogTrace::~CLogTrace()
{

}

////////////////////////////////////////////////////////
//  CLogTrace operations

void CLogTrace::ResetFile()
{
	CStdioFile f;
	CFileException fe;
	CString s;

	if (m_strFileName.IsEmpty()) return;

	if (f.Open(m_strFileName, CFile::modeWrite | CFile::modeCreate, &fe) == FALSE)
	{
		return;
	}

	f.Close();
}

// bActive tells us if we want the trace to be active or not
// bTimeStamp tells us if we want time stamps on each line
// eliminating the time stamp allows us to use this class for a regular log file
void CLogTrace::OnStartup(BOOL bActive, BOOL bTimeStamp)
{
	m_bActive = bActive;
	m_bTimeStamp = bTimeStamp;
	if (bTimeStamp == FALSE) return;
	CString s;

	// these ***'s help to indicate when one ru of the program ends and another starts
	// because we don't always overwrite the file each time

	WriteLine("\n\n******************************************\n\n");
	s.Format("%s Log Trace %s\n\n", m_strAppName, COleDateTime::GetCurrentTime().Format());
	WriteLine(s);
}

// function to write a line of text to the log file
void CLogTrace::WriteLine(LPCTSTR szLine)
{
	CStdioFile f;
	CFileException fe;
	CString s;

	if (m_bActive == FALSE) return;
	if (m_strFileName.IsEmpty()) return;

	if (f.Open(m_strFileName, CFile::modeWrite | CFile::modeCreate |
		CFile::modeNoTruncate, &fe) == FALSE)
	{
		return;
	}

	try
	{
		f.SeekToEnd();
		TRACE("LOGGIN %s\n", szLine);
		if (m_bTimeStamp)
		{
			s.Format("%s\t%s\n", COleDateTime::GetCurrentTime().Format(),
				szLine);
		}
		else
		{
			s.Format("%s\n", szLine);
		}
		f.WriteString(s);
	}
	catch (CException* e)
	{
		// Note that there is not much we can do if there is an exception
		// It is not practical to tell the user each time
		// and we can't write the error to a log file!!!!
		e->Delete();
	}
	f.Close();
}

// function to write a line of text, with an extra string
void CLogTrace::WriteLine(LPCTSTR szFormat, LPCTSTR szAddInfo)
{
	if (m_bActive == FALSE) return;
	CString s;
	s.Format(szFormat, szAddInfo);
	WriteLine(s);
}

// function to write a line of text with an extra integer
void CLogTrace::WriteLine(LPCTSTR szFormat, int nAddInfo)
{
	if (m_bActive == FALSE) return;
	CString s;
	s.Format(szFormat, nAddInfo);
	WriteLine(s);
}

// function to set the log file name.  don't pass a fill path!
// just pass something like "log.txt"
// the file will be placed in the same dir as the exe file
void CLogTrace::SetFileName(LPCTSTR szFileName)
{
	TCHAR drive[_MAX_PATH], dir[_MAX_PATH], name[_MAX_PATH], ext[_MAX_PATH];
	const char *path = _pgmptr ;
	_splitpath(path, drive, dir, name, ext);
	m_strFileName.Format("%s%s%s", drive, dir, szFileName);
}

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.