core/CLogger.cpp
author Borja Ferrer <faluco@alliedmods.net>
Fri Jan 05 00:42:22 2007 +0000 (2007-01-05)
changeset 268 d6fed4f05e07
parent 266 125549675242
child 270 04f8bbe51beb
permissions -rw-r--r--
Fixed CPlayer init, it was called too early.
nothing important on the logger
faluco@266
     1
#include "CLogger.h"
faluco@266
     2
#include "systems/Librarysys.h"
faluco@266
     3
faluco@266
     4
CLogger g_Logger;
faluco@266
     5
faluco@266
     6
void CLogger::_NewMapFile()
faluco@266
     7
{
faluco@266
     8
	if (!m_Active)
faluco@266
     9
	{
faluco@266
    10
		return;
faluco@266
    11
	}
faluco@266
    12
	
faluco@266
    13
	char _filename[256];
faluco@266
    14
	int i = 0;
faluco@266
    15
faluco@266
    16
	time_t t;
faluco@266
    17
	time(&t);
faluco@266
    18
	tm *curtime = localtime(&t);
faluco@266
    19
faluco@266
    20
	while (true)
faluco@266
    21
	{
faluco@266
    22
		g_LibSys.PathFormat(_filename, sizeof(_filename), "%s/logs/L%02d%02d%03d.log", g_SourceMod.GetSMBaseDir(), curtime->tm_mon + 1, curtime->tm_mday, i);
faluco@266
    23
		FILE *fp = fopen(_filename, "r");
faluco@266
    24
		if (!fp)
faluco@266
    25
		{
faluco@266
    26
			break;
faluco@266
    27
		}
faluco@266
    28
		fclose(fp);
faluco@266
    29
		i++;
faluco@266
    30
	}
faluco@266
    31
	m_NrmFileName.assign(_filename);
faluco@266
    32
faluco@266
    33
	FILE *fp = fopen(m_NrmFileName.c_str(), "w");
faluco@266
    34
	if (!fp)
faluco@266
    35
	{
faluco@266
    36
		g_SMAPI->ConPrint("[SM] Unexpected fatal logging error. SourceMod logging disabled.\n");
faluco@266
    37
		m_Active = false;
faluco@266
    38
	} else {
faluco@266
    39
		char date[32];
faluco@266
    40
		strftime(date, sizeof(date), "%m/%d/%Y - %H:%M:%S", curtime);
faluco@266
    41
		fprintf(fp, "L %s: SourceMod log file started (file \"L%02d%02d%03d.log\") (Version \"%s\")\n", date, curtime->tm_mon + 1, curtime->tm_mday, i, SOURCEMOD_VERSION);
faluco@268
    42
		if (m_PrntMapname)
faluco@268
    43
		{
faluco@268
    44
			fprintf(fp, "L %s: Info (map \"%s\")\n", date, m_CurMapName.c_str());
faluco@268
    45
			m_PrntMapname = false;
faluco@268
    46
		}
faluco@266
    47
		fclose(fp);
faluco@266
    48
	}
faluco@266
    49
}
faluco@266
    50
faluco@266
    51
void CLogger::_CloseFile()
faluco@266
    52
{
faluco@266
    53
	if (!m_Active)
faluco@266
    54
	{
faluco@266
    55
		return;
faluco@266
    56
	}
faluco@266
    57
faluco@266
    58
	FILE *fp = NULL;
faluco@266
    59
	if (!m_NrmFileName.empty())
faluco@266
    60
	{
faluco@266
    61
		fp = fopen(m_NrmFileName.c_str(), "r+");
faluco@266
    62
		if (fp)
faluco@266
    63
		{
faluco@266
    64
			fseek(fp, 0, SEEK_END);
faluco@266
    65
			LogMessage("Log file closed.");
faluco@266
    66
			fclose(fp);
faluco@266
    67
		}
faluco@266
    68
		m_NrmFileName.clear();
faluco@266
    69
	}
faluco@266
    70
faluco@266
    71
	if (!m_ErrMapStart)
faluco@266
    72
	{
faluco@266
    73
		return;
faluco@266
    74
	}
faluco@266
    75
	fp = fopen(m_ErrFileName.c_str(), "r+");
faluco@266
    76
	if (fp)
faluco@266
    77
	{
faluco@266
    78
		fseek(fp, 0, SEEK_END);
faluco@266
    79
		LogMessageEx(LogType_Error, "Error log file session closed.");
faluco@266
    80
		fclose(fp);
faluco@266
    81
	}
faluco@266
    82
	m_ErrFileName.clear();
faluco@266
    83
}
faluco@266
    84
faluco@266
    85
void CLogger::InitLogger(LoggingMode mode, bool startlogging)
faluco@266
    86
{
faluco@266
    87
	m_mode = mode;
faluco@266
    88
	m_Active = startlogging;
faluco@266
    89
faluco@266
    90
	time_t t;
faluco@266
    91
	time(&t);
faluco@266
    92
	tm *curtime = localtime(&t);
faluco@266
    93
	m_CurDay = curtime->tm_mday;
faluco@266
    94
faluco@266
    95
	char _filename[256];
faluco@266
    96
	g_LibSys.PathFormat(_filename, sizeof(_filename), "%s/logs/errors_%02d%02d%02d.log", g_SourceMod.GetSMBaseDir(), curtime->tm_mon + 1, curtime->tm_mday, curtime->tm_year - 100);
faluco@266
    97
	m_ErrFileName.assign(_filename);
faluco@266
    98
faluco@266
    99
	switch (m_mode)
faluco@266
   100
	{
faluco@266
   101
	case LoggingMode_PerMap:
faluco@266
   102
		{
faluco@266
   103
			if (!startlogging)
faluco@266
   104
			{
faluco@266
   105
				m_DelayedStart = true;
faluco@266
   106
			}
faluco@266
   107
			break;
faluco@266
   108
		}
faluco@266
   109
	case LoggingMode_Daily:
faluco@266
   110
		{
faluco@266
   111
			g_LibSys.PathFormat(_filename, sizeof(_filename), "%s/logs/L%02d%02d.log", g_SourceMod.GetSMBaseDir(), curtime->tm_mon + 1, curtime->tm_mday);
faluco@266
   112
			m_NrmFileName.assign(_filename);
faluco@266
   113
			m_DailyPrintHdr = true;
faluco@266
   114
			break;
faluco@266
   115
		}
faluco@266
   116
	}
faluco@266
   117
}
faluco@266
   118
faluco@266
   119
void CLogger::CloseLogger()
faluco@266
   120
{
faluco@266
   121
	_CloseFile();
faluco@266
   122
}
faluco@266
   123
faluco@266
   124
void CLogger::LogMessage(const char *vafmt, ...)
faluco@266
   125
{
faluco@266
   126
	if (!m_Active)
faluco@266
   127
	{
faluco@266
   128
		return;
faluco@266
   129
	}
faluco@266
   130
faluco@266
   131
	if (m_mode == LoggingMode_HL2)
faluco@266
   132
	{
faluco@266
   133
		_PrintToHL2Log(vafmt);
faluco@266
   134
		return;
faluco@266
   135
	}
faluco@266
   136
faluco@266
   137
	if (m_DelayedStart)
faluco@266
   138
	{
faluco@266
   139
		m_DelayedStart = false;
faluco@266
   140
		_NewMapFile();
faluco@266
   141
	}
faluco@266
   142
faluco@266
   143
	static char msg[3072];
faluco@266
   144
	va_list ap;
faluco@266
   145
	va_start(ap, vafmt);
faluco@266
   146
	vsnprintf(msg, sizeof(msg), vafmt, ap);
faluco@266
   147
	va_end(ap);
faluco@266
   148
faluco@266
   149
	char date[32];
faluco@266
   150
	time_t t;
faluco@266
   151
	time(&t);
faluco@266
   152
	tm *curtime = localtime(&t);
faluco@266
   153
	strftime(date, sizeof(date), "%m/%d/%Y - %H:%M:%S", curtime);
faluco@266
   154
faluco@266
   155
	FILE *fp = NULL;
faluco@266
   156
	if (m_mode == LoggingMode_PerMap)
faluco@266
   157
	{
faluco@266
   158
		fp = fopen(m_NrmFileName.c_str(), "a+");
faluco@266
   159
		if (!fp)
faluco@266
   160
		{
faluco@266
   161
			_NewMapFile();
faluco@266
   162
			fp = fopen(m_NrmFileName.c_str(), "a+");
faluco@266
   163
			if (!fp)
faluco@266
   164
			{
faluco@266
   165
				goto print_error;
faluco@266
   166
			}
faluco@266
   167
		}
faluco@266
   168
	} else {
faluco@266
   169
		if (m_CurDay != curtime->tm_mday)
faluco@266
   170
		{
faluco@266
   171
			char _filename[256];
faluco@266
   172
			g_LibSys.PathFormat(_filename, sizeof(_filename), "%s/logs/L%02d%02d.log", g_SourceMod.GetSMBaseDir(), curtime->tm_mon + 1, curtime->tm_mday);
faluco@266
   173
			m_NrmFileName.assign(_filename);
faluco@266
   174
			m_CurDay = curtime->tm_mday;
faluco@266
   175
			m_DailyPrintHdr = true;
faluco@266
   176
		}
faluco@266
   177
		fp = fopen(m_NrmFileName.c_str(), "a+");
faluco@266
   178
	}
faluco@266
   179
faluco@266
   180
	if (fp)
faluco@266
   181
	{
faluco@266
   182
		if (m_DailyPrintHdr)
faluco@266
   183
		{
faluco@266
   184
			m_DailyPrintHdr = false;
faluco@266
   185
			fprintf(fp, "L %s: SourceMod log file started (file \"L%02d%02d.log\") (Version \"%s\")\n", date, curtime->tm_mon + 1, curtime->tm_mday, SOURCEMOD_VERSION);
faluco@266
   186
		}
faluco@266
   187
		fprintf(fp, "L %s: %s\n", date, msg);
faluco@266
   188
		fclose(fp);
faluco@266
   189
	} else {
faluco@266
   190
		goto print_error;
faluco@266
   191
	}
faluco@266
   192
faluco@266
   193
	g_SMAPI->ConPrintf("L %s: %s\n", date, msg);
faluco@266
   194
print_error:
faluco@266
   195
	g_SMAPI->ConPrint("[SM] Unexpected fatal logging error. SourceMod logging disabled.\n");
faluco@266
   196
	m_Active = false;
faluco@266
   197
}
faluco@266
   198
faluco@266
   199
void CLogger::LogMessageEx(LogType type, const char *vafmt, ...)
faluco@266
   200
{
faluco@266
   201
	if (!m_Active)
faluco@266
   202
	{
faluco@266
   203
		return;
faluco@266
   204
	}
faluco@266
   205
faluco@266
   206
	if (type == LogType_Normal)
faluco@266
   207
	{
faluco@266
   208
		LogMessage(vafmt);
faluco@266
   209
		return;
faluco@266
   210
	}
faluco@266
   211
faluco@266
   212
	time_t t;
faluco@266
   213
	time(&t);
faluco@266
   214
	tm *curtime = localtime(&t);
faluco@266
   215
faluco@266
   216
	char date[32];
faluco@266
   217
	strftime(date, sizeof(date), "%m/%d/%Y - %H:%M:%S", curtime);
faluco@266
   218
faluco@266
   219
	if (curtime->tm_mday != m_CurDay)
faluco@266
   220
	{
faluco@266
   221
		char _filename[256];
faluco@266
   222
		g_LibSys.PathFormat(_filename, sizeof(_filename), "%s/logs/errors_%02d%02d%02d.log", g_SourceMod.GetSMBaseDir(), curtime->tm_mon + 1, curtime->tm_mday, curtime->tm_year - 100);
faluco@266
   223
		m_ErrFileName.assign(_filename);
faluco@266
   224
		m_CurDay = curtime->tm_mday;
faluco@266
   225
		m_ErrMapStart = false;
faluco@266
   226
	}
faluco@266
   227
faluco@266
   228
	static char msg[3072];
faluco@266
   229
	va_list ap;
faluco@266
   230
	va_start(ap, vafmt);
faluco@266
   231
	vsnprintf(msg, sizeof(msg), vafmt, ap);
faluco@266
   232
	va_end(ap);
faluco@266
   233
faluco@266
   234
	FILE *fp = fopen(m_ErrFileName.c_str(), "a+");
faluco@266
   235
	if (fp)
faluco@266
   236
	{
faluco@266
   237
		if (!m_ErrMapStart)
faluco@266
   238
		{
faluco@266
   239
			fprintf(fp, "L %s: SourceMod error session started\n", date);
faluco@266
   240
			fprintf(fp, "L %s: Info (map \"%s\") (log file \"errors_%02d%02d%02d.log\")\n", date, m_CurMapName.c_str(), curtime->tm_mon + 1, curtime->tm_mday, curtime->tm_year - 100);
faluco@266
   241
			m_ErrMapStart = true;
faluco@266
   242
		}
faluco@266
   243
		fprintf(fp, "L %s: %s\n", date, msg);
faluco@266
   244
		fclose(fp);
faluco@266
   245
	} else {
faluco@266
   246
		g_SMAPI->ConPrint("[SM] Unexpected fatal logging error. SourceMod logging disabled.\n");
faluco@266
   247
		m_Active = false;
faluco@266
   248
	}
faluco@266
   249
faluco@266
   250
	g_SMAPI->ConPrintf("L %s: %s\n", date, msg);
faluco@266
   251
}
faluco@266
   252
faluco@266
   253
void CLogger::MapChange(const char *mapname)
faluco@266
   254
{
faluco@266
   255
	m_CurMapName.assign(mapname);
faluco@268
   256
	m_PrntMapname = true;
faluco@266
   257
faluco@266
   258
	switch (m_mode)
faluco@266
   259
	{
faluco@266
   260
	case LoggingMode_Daily:
faluco@266
   261
		{
faluco@266
   262
			LogMessage("-------- Mapchange to %s --------", mapname);
faluco@266
   263
			break;
faluco@266
   264
		}
faluco@266
   265
	case LoggingMode_PerMap:
faluco@266
   266
		{
faluco@266
   267
			_NewMapFile();
faluco@266
   268
			break;
faluco@266
   269
		}
faluco@266
   270
	}
faluco@266
   271
faluco@266
   272
	if (m_ErrMapStart)
faluco@266
   273
	{
faluco@266
   274
		LogMessageEx(LogType_Error, "Error log file session closed.");
faluco@266
   275
	}
faluco@266
   276
	m_ErrMapStart = false;
faluco@266
   277
}
faluco@266
   278
faluco@266
   279
void CLogger::_PrintToHL2Log(const char *fmt, ...)
faluco@266
   280
{
faluco@266
   281
	static char msg[3072];
faluco@266
   282
	size_t len;
faluco@266
   283
faluco@266
   284
	va_list ap;
faluco@266
   285
	va_start(ap, fmt);
faluco@266
   286
	len = vsnprintf(msg, sizeof(msg)-1, fmt, ap);
faluco@266
   287
	msg[len++] = '\n';
faluco@266
   288
	msg[len] = '\0';
faluco@266
   289
	va_end(ap);
faluco@266
   290
faluco@266
   291
	engine->LogPrint(msg);
faluco@266
   292
}