Initial import of the logger
authorBorja Ferrer <faluco@alliedmods.net>
Thu Jan 04 23:41:51 2007 +0000 (2007-01-04)
changeset 266125549675242
parent 265 9d9b3e62e1ba
child 267 44124d4ac271
Initial import of the logger
core/CLogger.cpp
core/CLogger.h
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/core/CLogger.cpp	Thu Jan 04 23:41:51 2007 +0000
     1.3 @@ -0,0 +1,287 @@
     1.4 +#include "CLogger.h"
     1.5 +#include "systems/Librarysys.h"
     1.6 +
     1.7 +CLogger g_Logger;
     1.8 +
     1.9 +void CLogger::_NewMapFile()
    1.10 +{
    1.11 +	if (!m_Active)
    1.12 +	{
    1.13 +		return;
    1.14 +	}
    1.15 +	
    1.16 +	char _filename[256];
    1.17 +	int i = 0;
    1.18 +
    1.19 +	time_t t;
    1.20 +	time(&t);
    1.21 +	tm *curtime = localtime(&t);
    1.22 +
    1.23 +	while (true)
    1.24 +	{
    1.25 +		g_LibSys.PathFormat(_filename, sizeof(_filename), "%s/logs/L%02d%02d%03d.log", g_SourceMod.GetSMBaseDir(), curtime->tm_mon + 1, curtime->tm_mday, i);
    1.26 +		FILE *fp = fopen(_filename, "r");
    1.27 +		if (!fp)
    1.28 +		{
    1.29 +			break;
    1.30 +		}
    1.31 +		fclose(fp);
    1.32 +		i++;
    1.33 +	}
    1.34 +	m_NrmFileName.assign(_filename);
    1.35 +
    1.36 +	FILE *fp = fopen(m_NrmFileName.c_str(), "w");
    1.37 +	if (!fp)
    1.38 +	{
    1.39 +		g_SMAPI->ConPrint("[SM] Unexpected fatal logging error. SourceMod logging disabled.\n");
    1.40 +		m_Active = false;
    1.41 +	} else {
    1.42 +		char date[32];
    1.43 +		strftime(date, sizeof(date), "%m/%d/%Y - %H:%M:%S", curtime);
    1.44 +		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);
    1.45 +		fprintf(fp, "L %s: Info (map \"%s\")\n", date, m_CurMapName.c_str());
    1.46 +		fclose(fp);
    1.47 +	}
    1.48 +}
    1.49 +
    1.50 +void CLogger::_CloseFile()
    1.51 +{
    1.52 +	if (!m_Active)
    1.53 +	{
    1.54 +		return;
    1.55 +	}
    1.56 +
    1.57 +	FILE *fp = NULL;
    1.58 +	if (!m_NrmFileName.empty())
    1.59 +	{
    1.60 +		fp = fopen(m_NrmFileName.c_str(), "r+");
    1.61 +		if (fp)
    1.62 +		{
    1.63 +			fseek(fp, 0, SEEK_END);
    1.64 +			LogMessage("Log file closed.");
    1.65 +			fclose(fp);
    1.66 +		}
    1.67 +		m_NrmFileName.clear();
    1.68 +	}
    1.69 +
    1.70 +	if (!m_ErrMapStart)
    1.71 +	{
    1.72 +		return;
    1.73 +	}
    1.74 +	fp = fopen(m_ErrFileName.c_str(), "r+");
    1.75 +	if (fp)
    1.76 +	{
    1.77 +		fseek(fp, 0, SEEK_END);
    1.78 +		LogMessageEx(LogType_Error, "Error log file session closed.");
    1.79 +		fclose(fp);
    1.80 +	}
    1.81 +	m_ErrFileName.clear();
    1.82 +}
    1.83 +
    1.84 +void CLogger::InitLogger(LoggingMode mode, bool startlogging)
    1.85 +{
    1.86 +	m_mode = mode;
    1.87 +	m_Active = startlogging;
    1.88 +
    1.89 +	time_t t;
    1.90 +	time(&t);
    1.91 +	tm *curtime = localtime(&t);
    1.92 +	m_CurDay = curtime->tm_mday;
    1.93 +
    1.94 +	char _filename[256];
    1.95 +	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);
    1.96 +	m_ErrFileName.assign(_filename);
    1.97 +
    1.98 +	switch (m_mode)
    1.99 +	{
   1.100 +	case LoggingMode_PerMap:
   1.101 +		{
   1.102 +			if (!startlogging)
   1.103 +			{
   1.104 +				m_DelayedStart = true;
   1.105 +			}
   1.106 +			break;
   1.107 +		}
   1.108 +	case LoggingMode_Daily:
   1.109 +		{
   1.110 +			g_LibSys.PathFormat(_filename, sizeof(_filename), "%s/logs/L%02d%02d.log", g_SourceMod.GetSMBaseDir(), curtime->tm_mon + 1, curtime->tm_mday);
   1.111 +			m_NrmFileName.assign(_filename);
   1.112 +			m_DailyPrintHdr = true;
   1.113 +			break;
   1.114 +		}
   1.115 +	}
   1.116 +}
   1.117 +
   1.118 +void CLogger::CloseLogger()
   1.119 +{
   1.120 +	_CloseFile();
   1.121 +}
   1.122 +
   1.123 +void CLogger::LogMessage(const char *vafmt, ...)
   1.124 +{
   1.125 +	if (!m_Active)
   1.126 +	{
   1.127 +		return;
   1.128 +	}
   1.129 +
   1.130 +	if (m_mode == LoggingMode_HL2)
   1.131 +	{
   1.132 +		_PrintToHL2Log(vafmt);
   1.133 +		return;
   1.134 +	}
   1.135 +
   1.136 +	if (m_DelayedStart)
   1.137 +	{
   1.138 +		m_DelayedStart = false;
   1.139 +		_NewMapFile();
   1.140 +	}
   1.141 +
   1.142 +	static char msg[3072];
   1.143 +	va_list ap;
   1.144 +	va_start(ap, vafmt);
   1.145 +	vsnprintf(msg, sizeof(msg), vafmt, ap);
   1.146 +	va_end(ap);
   1.147 +
   1.148 +	char date[32];
   1.149 +	time_t t;
   1.150 +	time(&t);
   1.151 +	tm *curtime = localtime(&t);
   1.152 +	strftime(date, sizeof(date), "%m/%d/%Y - %H:%M:%S", curtime);
   1.153 +
   1.154 +	FILE *fp = NULL;
   1.155 +	if (m_mode == LoggingMode_PerMap)
   1.156 +	{
   1.157 +		fp = fopen(m_NrmFileName.c_str(), "a+");
   1.158 +		if (!fp)
   1.159 +		{
   1.160 +			_NewMapFile();
   1.161 +			fp = fopen(m_NrmFileName.c_str(), "a+");
   1.162 +			if (!fp)
   1.163 +			{
   1.164 +				goto print_error;
   1.165 +			}
   1.166 +		}
   1.167 +	} else {
   1.168 +		if (m_CurDay != curtime->tm_mday)
   1.169 +		{
   1.170 +			char _filename[256];
   1.171 +			g_LibSys.PathFormat(_filename, sizeof(_filename), "%s/logs/L%02d%02d.log", g_SourceMod.GetSMBaseDir(), curtime->tm_mon + 1, curtime->tm_mday);
   1.172 +			m_NrmFileName.assign(_filename);
   1.173 +			m_CurDay = curtime->tm_mday;
   1.174 +			m_DailyPrintHdr = true;
   1.175 +		}
   1.176 +		fp = fopen(m_NrmFileName.c_str(), "a+");
   1.177 +	}
   1.178 +
   1.179 +	if (fp)
   1.180 +	{
   1.181 +		if (m_DailyPrintHdr)
   1.182 +		{
   1.183 +			m_DailyPrintHdr = false;
   1.184 +			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);
   1.185 +		}
   1.186 +		fprintf(fp, "L %s: %s\n", date, msg);
   1.187 +		fclose(fp);
   1.188 +	} else {
   1.189 +		goto print_error;
   1.190 +	}
   1.191 +
   1.192 +	g_SMAPI->ConPrintf("L %s: %s\n", date, msg);
   1.193 +print_error:
   1.194 +	g_SMAPI->ConPrint("[SM] Unexpected fatal logging error. SourceMod logging disabled.\n");
   1.195 +	m_Active = false;
   1.196 +}
   1.197 +
   1.198 +void CLogger::LogMessageEx(LogType type, const char *vafmt, ...)
   1.199 +{
   1.200 +	if (!m_Active)
   1.201 +	{
   1.202 +		return;
   1.203 +	}
   1.204 +
   1.205 +	if (type == LogType_Normal)
   1.206 +	{
   1.207 +		LogMessage(vafmt);
   1.208 +		return;
   1.209 +	}
   1.210 +
   1.211 +	time_t t;
   1.212 +	time(&t);
   1.213 +	tm *curtime = localtime(&t);
   1.214 +
   1.215 +	char date[32];
   1.216 +	strftime(date, sizeof(date), "%m/%d/%Y - %H:%M:%S", curtime);
   1.217 +
   1.218 +	if (curtime->tm_mday != m_CurDay)
   1.219 +	{
   1.220 +		char _filename[256];
   1.221 +		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);
   1.222 +		m_ErrFileName.assign(_filename);
   1.223 +		m_CurDay = curtime->tm_mday;
   1.224 +		m_ErrMapStart = false;
   1.225 +	}
   1.226 +
   1.227 +	static char msg[3072];
   1.228 +	va_list ap;
   1.229 +	va_start(ap, vafmt);
   1.230 +	vsnprintf(msg, sizeof(msg), vafmt, ap);
   1.231 +	va_end(ap);
   1.232 +
   1.233 +	FILE *fp = fopen(m_ErrFileName.c_str(), "a+");
   1.234 +	if (fp)
   1.235 +	{
   1.236 +		if (!m_ErrMapStart)
   1.237 +		{
   1.238 +			fprintf(fp, "L %s: SourceMod error session started\n", date);
   1.239 +			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);
   1.240 +			m_ErrMapStart = true;
   1.241 +		}
   1.242 +		fprintf(fp, "L %s: %s\n", date, msg);
   1.243 +		fclose(fp);
   1.244 +	} else {
   1.245 +		g_SMAPI->ConPrint("[SM] Unexpected fatal logging error. SourceMod logging disabled.\n");
   1.246 +		m_Active = false;
   1.247 +	}
   1.248 +
   1.249 +	g_SMAPI->ConPrintf("L %s: %s\n", date, msg);
   1.250 +}
   1.251 +
   1.252 +void CLogger::MapChange(const char *mapname)
   1.253 +{
   1.254 +	m_CurMapName.assign(mapname);
   1.255 +
   1.256 +	switch (m_mode)
   1.257 +	{
   1.258 +	case LoggingMode_Daily:
   1.259 +		{
   1.260 +			LogMessage("-------- Mapchange to %s --------", mapname);
   1.261 +			break;
   1.262 +		}
   1.263 +	case LoggingMode_PerMap:
   1.264 +		{
   1.265 +			_NewMapFile();
   1.266 +			break;
   1.267 +		}
   1.268 +	}
   1.269 +
   1.270 +	if (m_ErrMapStart)
   1.271 +	{
   1.272 +		LogMessageEx(LogType_Error, "Error log file session closed.");
   1.273 +	}
   1.274 +	m_ErrMapStart = false;
   1.275 +}
   1.276 +
   1.277 +void CLogger::_PrintToHL2Log(const char *fmt, ...)
   1.278 +{
   1.279 +	static char msg[3072];
   1.280 +	size_t len;
   1.281 +
   1.282 +	va_list ap;
   1.283 +	va_start(ap, fmt);
   1.284 +	len = vsnprintf(msg, sizeof(msg)-1, fmt, ap);
   1.285 +	msg[len++] = '\n';
   1.286 +	msg[len] = '\0';
   1.287 +	va_end(ap);
   1.288 +
   1.289 +	engine->LogPrint(msg);
   1.290 +}
   1.291 \ No newline at end of file
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/core/CLogger.h	Thu Jan 04 23:41:51 2007 +0000
     2.3 @@ -0,0 +1,101 @@
     2.4 +#ifndef _INCLUDE_SOURCEMOD_CLOGGER_H_
     2.5 +#define _INCLUDE_SOURCEMOD_CLOGGER_H_
     2.6 +
     2.7 +#include <time.h>
     2.8 +#include "sourcemm_api.h"
     2.9 +#include <sh_string.h>
    2.10 +#include "sourcemod.h"
    2.11 +#include "sm_version.h"
    2.12 +
    2.13 +using namespace SourceHook;
    2.14 +
    2.15 +enum LogType
    2.16 +{
    2.17 +	LogType_Normal,
    2.18 +	LogType_Error
    2.19 +};
    2.20 +
    2.21 +enum LoggingMode
    2.22 +{
    2.23 +	LoggingMode_Daily,
    2.24 +	LoggingMode_PerMap,
    2.25 +	LoggingMode_HL2
    2.26 +};
    2.27 +
    2.28 +class CLogger
    2.29 +{
    2.30 +public:
    2.31 +	CLogger() : m_ErrMapStart(false), m_Active(false), m_DelayedStart(false), m_DailyPrintHdr(false) {}
    2.32 +public:
    2.33 +	void InitLogger(LoggingMode mode, bool startlogging);
    2.34 +	void CloseLogger();
    2.35 +	void EnableLogging();
    2.36 +	void DisableLogging();
    2.37 +	void LogMessage(const char *msg, ...);
    2.38 +	void LogMessageEx(LogType type, const char *msg, ...);
    2.39 +	void MapChange(const char *mapname);
    2.40 +	const char *GetLogFileName(LogType type);
    2.41 +	LoggingMode GetLoggingMode();
    2.42 +private:
    2.43 +	void _CloseFile();
    2.44 +	void _NewMapFile();
    2.45 +	void _PrintToHL2Log(const char *fmt, ...);
    2.46 +private:
    2.47 +	String m_NrmFileName;
    2.48 +	String m_ErrFileName;
    2.49 +	String m_CurMapName;
    2.50 +	LoggingMode m_mode;
    2.51 +	int m_CurDay;
    2.52 +	bool m_ErrMapStart;
    2.53 +	bool m_Active;
    2.54 +	bool m_DelayedStart;
    2.55 +	bool m_DailyPrintHdr;
    2.56 +};
    2.57 +
    2.58 +extern CLogger g_Logger;
    2.59 +
    2.60 +inline const char *CLogger::GetLogFileName(LogType type)
    2.61 +{
    2.62 +	switch (type)
    2.63 +	{
    2.64 +	case LogType_Normal:
    2.65 +		{
    2.66 +			return m_NrmFileName.c_str();
    2.67 +		}
    2.68 +	case LogType_Error:
    2.69 +		{
    2.70 +			return m_ErrFileName.c_str();
    2.71 +		}
    2.72 +	default:
    2.73 +		{
    2.74 +			return "";
    2.75 +		}
    2.76 +	}
    2.77 +}
    2.78 +
    2.79 +inline LoggingMode CLogger::GetLoggingMode()
    2.80 +{
    2.81 +	return m_mode;
    2.82 +}
    2.83 +
    2.84 +inline void CLogger::EnableLogging()
    2.85 +{
    2.86 +	if (m_Active)
    2.87 +	{
    2.88 +		return;
    2.89 +	}
    2.90 +	m_Active = true;
    2.91 +	LogMessage("Logging enabled manually by user.");
    2.92 +}
    2.93 +
    2.94 +inline void CLogger::DisableLogging()
    2.95 +{
    2.96 +	if (!m_Active)
    2.97 +	{
    2.98 +		return;
    2.99 +	}
   2.100 +	LogMessage("Logging disabled manually by user.");
   2.101 +	m_Active = false;
   2.102 +}
   2.103 +
   2.104 +#endif // _INCLUDE_SOURCEMOD_CLOGGER_H_
   2.105 \ No newline at end of file