1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
/*
* Modification History
*
* 2002-February-25 Jason Rohrer
* Created.
*
* 2002-March-13 Jason Rohrer
* Added a flush after every write.
*
* 2002-April-8 Jason Rohrer
* Changed to be thread-safe.
*
* 2002-November-5 Jason Rohrer
* Added support for backing up logs and deleting old log data.
*
* 2010-May-14 Jason Rohrer
* String parameters as const to fix warnings.
*/
#include "FileLog.h"
#include "PrintLog.h"
#include "minorGems/util/stringUtils.h"
#include "minorGems/io/file/File.h"
#include <stdio.h>
#include <time.h>
const char *FileLog::mDefaultLogFileName = "default.log";
FileLog::FileLog( const char *inFileName, unsigned long inSecondsBetweenBackups )
: mLogFile( NULL ),
mLogFileName( stringDuplicate( inFileName ) ),
mSecondsBetweenBackups( inSecondsBetweenBackups ),
mTimeOfLastBackup( time( NULL ) ) {
mLogFile = fopen( mLogFileName, "a" );
if( mLogFile == NULL ) {
printf( "Log file %s failed to open.\n", mLogFileName );
printf( "Writing log to default file: %s\n",
mDefaultLogFileName );
// switch to default log file name
delete [] mLogFileName;
mLogFileName = stringDuplicate( mDefaultLogFileName );
mLogFile = fopen( mLogFileName, "a" );
if( mLogFile == NULL ) {
printf( "Default log file %s failed to open.\n",
mLogFileName );
}
}
}
FileLog::~FileLog() {
if( mLogFile != NULL ) {
fclose( mLogFile );
}
delete [] mLogFileName;
}
void FileLog::logString( const char *inLoggerName, const char *inString,
int inLevel ) {
if( mLogFile != NULL ) {
if( inLevel <= mLoggingLevel ) {
char *message = PrintLog::generateLogMessage( inLoggerName,
inString,
inLevel );
mLock->lock();
fprintf( mLogFile, "%s\n", message );
fflush( mLogFile );
if( time( NULL ) - mTimeOfLastBackup > mSecondsBetweenBackups ) {
makeBackup();
}
mLock->unlock();
delete [] message;
}
}
}
void FileLog::makeBackup() {
fclose( mLogFile );
File *currentLogFile = new File( NULL, mLogFileName );
char *backupFileName = new char[ strlen( mLogFileName ) + 10 ];
sprintf( backupFileName, "%s.backup", mLogFileName );
File *backupLogFile = new File( NULL, backupFileName );
delete [] backupFileName;
// copy into backup log file, which will overwrite it
currentLogFile->copy( backupLogFile );
delete currentLogFile;
delete backupLogFile;
// clear main log file and start writing to it again
mLogFile = fopen( mLogFileName, "w" );
if( mLogFile == NULL ) {
printf( "Log file %s failed to open.\n", mLogFileName );
}
mTimeOfLastBackup = time( NULL );
}
|