Introduction
Sometime we need to record something after we give the software to our
customers, so when something bad happened, we can find it out without the debug
environment. Sometime we want to get some trace information in the release mode
of the program. In these circumstances, a logfile is useful.
There are lots of logfile code examples here at codeproject and elsewhere.
This one is very simple, compared to some of the others.
The class CLogFile
has only three member functions: a
constructor, a destructor and a member called Write
. Let's see how
to use it.
The constructor needs 3 parameters:
CLogFile(LPCTSTR strFile, bool bAppend = FALSE,
long lTruncate = 4096)
The first parameter is the file name. It could include the absolute path, or
just a file name. In the latter case, the logfile would be created in the same
directory as the executable. Nothing concerned with the "Current Directory",
which always brings me trouble.
The second parameter indicate whether the log information should append to
the end of the file, if the file already exists.
The third parameter indicates the truncate size. If the logfile exceeds this
number, it rewinds to the beginning, and continues. The information following
writes to the file from the beginning.
The second member is the destructor. It does some cleaning jobs. Nothing more
to say.
The most important member is the third:
void Write(LPCTSTR pszFormat, ...)
This member writes a line to the logfile. Its usage is just the same as
printf. It seems that there could be much to say about this member, but I'd
prefer to keep things simple. And it is simple.
Features
- File name could use absolute path or just the name.
- Every log line has a time stamp attached.
- Uses printf like format to write log lines.
- Multithread safe.
Anything else is in the code. The thing is 108 lines of code in a .h file,
including comments and blank lines.
Update by Zoltan:
My project was a 24/7 application, so one log file could be to big. So I made
new log files every day which meant some months lots of files were made in each
directory. Finally I made folders for every year, every month, and a log files
are stored in the month folders.
I made the following function to change the current file name:
void ChangeFile(LPCTSTR strFile, bool bAppend = TRUE, long lTruncate = 4096);
These are the same params like old constructor, and when the file name is
different from the stored m_filename, first close the old logger file, then open
the new in the selected folder.
Using this feature
Most inportantly don't forget:
#define _DEBUG_LOG TRUE
#include "logfile.h"
The following code shows an example how can be use this. %02i is a useful
choose for month, so the 09 month will not overtake the 10 month.
For testing
choose systime.wMinute to faster create new folders.
CString name;
SYSTEMTIME systime;
GetLocalTime(&systime);
name.Format("%i\\%02i\\log_%02i%02i%02i.txt",
systime.wYear,
systime.wMonth,
systime.wYear,
systime.wMonth,
systime.wDay);
m_log.ChangeFile(name);
Features
- File name could use absolute path or just the name. (original by Yao)
- File name could be in a new folder, and a logger will create it.
Revision History
- 26 Jun 2002 - Initial Revision
- 20 Mar 2003 - updated by Zoltan