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