Click here to Skip to main content
15,860,972 members
Articles / Programming Languages / C++

A Class for Creating a Trace Log

Rate me:
Please Sign up or sign in to vote.
3.88/5 (10 votes)
17 Nov 19991 min read 100.2K   2.2K   42   8
A class for creating a Trace log

Introduction

So the Debug build works great, but the Release build crashes? Or the program works fine on your computer, but crashes on the customer's computers? You need to add trace functionality to the Release build.

CLogTrace is a class that allows you to easily add trace functionality to the release build of a program. You make the program write lines of text to a log file at various stages in the program. You provide the code to turn the logging on or off. Much like using the TRACE macro, you get a text file that tells you what functions were called, with a date/time stamp. Except you can get this information in release builds.

The class is easy to use.

  1. Make a static CLogTrace object as a member of the application class.
  2. Add the initialization lines in the program's InitInstance function.
  3. 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.

Here is an example log file output:

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

Here is the class interface:

////////////////////////////////////////////////////////////////////////
//  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__

Here is the class implementation:

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

License

This article has no explicit license attached to it, but may contain usage terms in the article text or the download files themselves. If in doubt, please contact the author via the discussion board below.

A list of licenses authors might use can be found here.


Written By
President Starpoint Software Inc.
United States United States
Bob Pittenger is founder and President of Starpoint Software Inc. He holds a B.A. degree from Miami University, M.S. and Ph.D. degrees from Purdue University, and an MBA from Xavier University. He has been programming since 1993, starting with Windows application development in C++/MFC and moving to C# and .NET around 2005 and is a .NET Microsoft Certified Professional Developer.

Bob is the author of two books:
Billionaire: How the Ultra-Rich Built Their Fortunes Through Good and Evil and What You Can Learn from Them
and
Wealthonomics: The Most Important Economic and Financial Concepts that Can Make You Rich Fast.
Visit http://www.billionairebook.net for more information.

Comments and Discussions

 
Generalexcellent Pin
Southmountain28-Aug-20 8:54
Southmountain28-Aug-20 8:54 
Questionfunction to write a line of text, with an extra string [modified] Pin
Vasanth MV26-Mar-07 0:43
Vasanth MV26-Mar-07 0:43 
GeneralSome suggestions... Pin
NV RAM19-Dec-03 4:52
NV RAM19-Dec-03 4:52 
GeneralProblems with code in debug version Pin
bishbosh029-Nov-02 1:11
bishbosh029-Nov-02 1:11 
QuestionHow would I use this in a DLL... Pin
Mel Riffe17-Jan-02 7:42
Mel Riffe17-Jan-02 7:42 
GeneralThanks a lot! Pin
5-Jun-01 14:56
suss5-Jun-01 14:56 
You do a great work!!!!
Every progammer need that!
Generalgreat stuff !!! Pin
Johan18-Aug-00 1:44
Johan18-Aug-00 1:44 
GeneralBe better not to use MFC... Pin
Maksym Schipka15-Apr-00 22:18
sussMaksym Schipka15-Apr-00 22:18 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.