3 #include "sourcemm_api.h"
5 #include "systems/Librarysys.h"
6 #include "sm_version.h"
10 void CLogger::OnSourceModStartup(bool late)
12 //:TODO: read these options from a file, dont hardcode them
13 InitLogger(LoggingMode_Daily, true);
16 void CLogger::OnSourceModAllShutdown()
21 void CLogger::_NewMapFile()
33 tm *curtime = localtime(&t);
37 g_SourceMod.BuildPath(Path_SM, _filename, sizeof(_filename), "logs/L%02d%02d%03d.log", curtime->tm_mon + 1, curtime->tm_mday, i);
38 FILE *fp = fopen(_filename, "r");
46 m_NrmFileName.assign(_filename);
48 FILE *fp = fopen(m_NrmFileName.c_str(), "w");
51 g_SMAPI->ConPrint("[SM] Unexpected fatal logging error. SourceMod logging disabled.\n");
56 strftime(date, sizeof(date), "%m/%d/%Y - %H:%M:%S", curtime);
57 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);
62 void CLogger::_CloseFile()
70 if (!m_NrmFileName.empty())
72 fp = fopen(m_NrmFileName.c_str(), "r+");
75 fseek(fp, 0, SEEK_END);
76 LogMessage("Log file closed.");
79 m_NrmFileName.clear();
86 fp = fopen(m_ErrFileName.c_str(), "r+");
89 fseek(fp, 0, SEEK_END);
90 LogError("Error log file session closed.");
93 m_ErrFileName.clear();
96 void CLogger::InitLogger(LoggingMode mode, bool startlogging)
99 m_Active = startlogging;
103 tm *curtime = localtime(&t);
104 m_CurDay = curtime->tm_mday;
107 g_SourceMod.BuildPath(Path_SM, _filename, sizeof(_filename), "logs/errors_%02d%02d%02d.log", curtime->tm_mon + 1, curtime->tm_mday, curtime->tm_year - 100);
108 m_ErrFileName.assign(_filename);
112 case LoggingMode_PerMap:
116 m_DelayedStart = true;
120 case LoggingMode_Daily:
122 g_SourceMod.BuildPath(Path_SM, _filename, sizeof(_filename), "logs/L%02d%02d.log", curtime->tm_mon + 1, curtime->tm_mday);
123 m_NrmFileName.assign(_filename);
124 m_DailyPrintHdr = true;
130 void CLogger::CloseLogger()
135 void CLogger::LogMessage(const char *vafmt, ...)
142 if (m_mode == LoggingMode_HL2)
146 _PrintToHL2Log(vafmt, ap);
153 m_DelayedStart = false;
160 vsnprintf(msg, sizeof(msg), vafmt, ap);
166 tm *curtime = localtime(&t);
167 strftime(date, sizeof(date), "%m/%d/%Y - %H:%M:%S", curtime);
170 if (m_mode == LoggingMode_PerMap)
172 fp = fopen(m_NrmFileName.c_str(), "a+");
176 fp = fopen(m_NrmFileName.c_str(), "a+");
183 if (m_CurDay != curtime->tm_mday)
186 g_SourceMod.BuildPath(Path_SM, _filename, sizeof(_filename), "logs/L%02d%02d.log", curtime->tm_mon + 1, curtime->tm_mday);
187 m_NrmFileName.assign(_filename);
188 m_CurDay = curtime->tm_mday;
189 m_DailyPrintHdr = true;
191 fp = fopen(m_NrmFileName.c_str(), "a+");
198 m_DailyPrintHdr = false;
199 fprintf(fp, "L %s: SourceMod log file session started (file \"L%02d%02d.log\") (Version \"%s\")\n", date, curtime->tm_mon + 1, curtime->tm_mday, SOURCEMOD_VERSION);
201 fprintf(fp, "L %s: %s\n", date, msg);
207 g_SMAPI->ConPrintf("L %s: %s\n", date, msg);
210 g_SMAPI->ConPrint("[SM] Unexpected fatal logging error. SourceMod logging disabled.\n");
214 void CLogger::LogError(const char *vafmt, ...)
223 tm *curtime = localtime(&t);
226 strftime(date, sizeof(date), "%m/%d/%Y - %H:%M:%S", curtime);
228 if (curtime->tm_mday != m_CurDay)
231 g_SourceMod.BuildPath(Path_SM, _filename, sizeof(_filename), "logs/errors_%02d%02d%02d.log", curtime->tm_mon + 1, curtime->tm_mday, curtime->tm_year - 100);
232 m_ErrFileName.assign(_filename);
233 m_CurDay = curtime->tm_mday;
234 m_ErrMapStart = false;
240 vsnprintf(msg, sizeof(msg), vafmt, ap);
243 FILE *fp = fopen(m_ErrFileName.c_str(), "a+");
248 fprintf(fp, "L %s: SourceMod error session started\n", date);
249 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);
250 m_ErrMapStart = true;
252 fprintf(fp, "L %s: %s\n", date, msg);
255 g_SMAPI->ConPrint("[SM] Unexpected fatal logging error. SourceMod logging disabled.\n");
260 g_SMAPI->ConPrintf("L %s: %s\n", date, msg);
263 void CLogger::MapChange(const char *mapname)
265 m_CurMapName.assign(mapname);
269 case LoggingMode_Daily:
271 LogMessage("-------- Mapchange to %s --------", mapname);
274 case LoggingMode_PerMap:
283 LogError("Error log file session closed.");
285 m_ErrMapStart = false;
288 void CLogger::_PrintToHL2Log(const char *fmt, va_list ap)
293 len = vsnprintf(msg, sizeof(msg)-2, fmt, ap);
294 len = (len >= sizeof(msg)) ? (sizeof(msg) - 2) : len;
299 engine->LogPrint(msg);
302 const char *CLogger::GetLogFileName(LogType type) const
308 return m_NrmFileName.c_str();
312 return m_ErrFileName.c_str();
321 LoggingMode CLogger::GetLoggingMode() const
326 void CLogger::EnableLogging()
333 LogMessage("Logging enabled manually by user.");
336 void CLogger::DisableLogging()
342 LogMessage("Logging disabled manually by user.");