Initial import of the logger
--HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40271
This commit is contained in:
parent
ab004f5ce5
commit
6a0ddf78d4
287
core/CLogger.cpp
Normal file
287
core/CLogger.cpp
Normal file
@ -0,0 +1,287 @@
|
|||||||
|
#include "CLogger.h"
|
||||||
|
#include "systems/Librarysys.h"
|
||||||
|
|
||||||
|
CLogger g_Logger;
|
||||||
|
|
||||||
|
void CLogger::_NewMapFile()
|
||||||
|
{
|
||||||
|
if (!m_Active)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
char _filename[256];
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
time_t t;
|
||||||
|
time(&t);
|
||||||
|
tm *curtime = localtime(&t);
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
g_LibSys.PathFormat(_filename, sizeof(_filename), "%s/logs/L%02d%02d%03d.log", g_SourceMod.GetSMBaseDir(), curtime->tm_mon + 1, curtime->tm_mday, i);
|
||||||
|
FILE *fp = fopen(_filename, "r");
|
||||||
|
if (!fp)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fclose(fp);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
m_NrmFileName.assign(_filename);
|
||||||
|
|
||||||
|
FILE *fp = fopen(m_NrmFileName.c_str(), "w");
|
||||||
|
if (!fp)
|
||||||
|
{
|
||||||
|
g_SMAPI->ConPrint("[SM] Unexpected fatal logging error. SourceMod logging disabled.\n");
|
||||||
|
m_Active = false;
|
||||||
|
} else {
|
||||||
|
char date[32];
|
||||||
|
strftime(date, sizeof(date), "%m/%d/%Y - %H:%M:%S", curtime);
|
||||||
|
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);
|
||||||
|
fprintf(fp, "L %s: Info (map \"%s\")\n", date, m_CurMapName.c_str());
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CLogger::_CloseFile()
|
||||||
|
{
|
||||||
|
if (!m_Active)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE *fp = NULL;
|
||||||
|
if (!m_NrmFileName.empty())
|
||||||
|
{
|
||||||
|
fp = fopen(m_NrmFileName.c_str(), "r+");
|
||||||
|
if (fp)
|
||||||
|
{
|
||||||
|
fseek(fp, 0, SEEK_END);
|
||||||
|
LogMessage("Log file closed.");
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
m_NrmFileName.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_ErrMapStart)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fp = fopen(m_ErrFileName.c_str(), "r+");
|
||||||
|
if (fp)
|
||||||
|
{
|
||||||
|
fseek(fp, 0, SEEK_END);
|
||||||
|
LogMessageEx(LogType_Error, "Error log file session closed.");
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
m_ErrFileName.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CLogger::InitLogger(LoggingMode mode, bool startlogging)
|
||||||
|
{
|
||||||
|
m_mode = mode;
|
||||||
|
m_Active = startlogging;
|
||||||
|
|
||||||
|
time_t t;
|
||||||
|
time(&t);
|
||||||
|
tm *curtime = localtime(&t);
|
||||||
|
m_CurDay = curtime->tm_mday;
|
||||||
|
|
||||||
|
char _filename[256];
|
||||||
|
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);
|
||||||
|
m_ErrFileName.assign(_filename);
|
||||||
|
|
||||||
|
switch (m_mode)
|
||||||
|
{
|
||||||
|
case LoggingMode_PerMap:
|
||||||
|
{
|
||||||
|
if (!startlogging)
|
||||||
|
{
|
||||||
|
m_DelayedStart = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case LoggingMode_Daily:
|
||||||
|
{
|
||||||
|
g_LibSys.PathFormat(_filename, sizeof(_filename), "%s/logs/L%02d%02d.log", g_SourceMod.GetSMBaseDir(), curtime->tm_mon + 1, curtime->tm_mday);
|
||||||
|
m_NrmFileName.assign(_filename);
|
||||||
|
m_DailyPrintHdr = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CLogger::CloseLogger()
|
||||||
|
{
|
||||||
|
_CloseFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CLogger::LogMessage(const char *vafmt, ...)
|
||||||
|
{
|
||||||
|
if (!m_Active)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_mode == LoggingMode_HL2)
|
||||||
|
{
|
||||||
|
_PrintToHL2Log(vafmt);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_DelayedStart)
|
||||||
|
{
|
||||||
|
m_DelayedStart = false;
|
||||||
|
_NewMapFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
static char msg[3072];
|
||||||
|
va_list ap;
|
||||||
|
va_start(ap, vafmt);
|
||||||
|
vsnprintf(msg, sizeof(msg), vafmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
char date[32];
|
||||||
|
time_t t;
|
||||||
|
time(&t);
|
||||||
|
tm *curtime = localtime(&t);
|
||||||
|
strftime(date, sizeof(date), "%m/%d/%Y - %H:%M:%S", curtime);
|
||||||
|
|
||||||
|
FILE *fp = NULL;
|
||||||
|
if (m_mode == LoggingMode_PerMap)
|
||||||
|
{
|
||||||
|
fp = fopen(m_NrmFileName.c_str(), "a+");
|
||||||
|
if (!fp)
|
||||||
|
{
|
||||||
|
_NewMapFile();
|
||||||
|
fp = fopen(m_NrmFileName.c_str(), "a+");
|
||||||
|
if (!fp)
|
||||||
|
{
|
||||||
|
goto print_error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (m_CurDay != curtime->tm_mday)
|
||||||
|
{
|
||||||
|
char _filename[256];
|
||||||
|
g_LibSys.PathFormat(_filename, sizeof(_filename), "%s/logs/L%02d%02d.log", g_SourceMod.GetSMBaseDir(), curtime->tm_mon + 1, curtime->tm_mday);
|
||||||
|
m_NrmFileName.assign(_filename);
|
||||||
|
m_CurDay = curtime->tm_mday;
|
||||||
|
m_DailyPrintHdr = true;
|
||||||
|
}
|
||||||
|
fp = fopen(m_NrmFileName.c_str(), "a+");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fp)
|
||||||
|
{
|
||||||
|
if (m_DailyPrintHdr)
|
||||||
|
{
|
||||||
|
m_DailyPrintHdr = false;
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
fprintf(fp, "L %s: %s\n", date, msg);
|
||||||
|
fclose(fp);
|
||||||
|
} else {
|
||||||
|
goto print_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_SMAPI->ConPrintf("L %s: %s\n", date, msg);
|
||||||
|
print_error:
|
||||||
|
g_SMAPI->ConPrint("[SM] Unexpected fatal logging error. SourceMod logging disabled.\n");
|
||||||
|
m_Active = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CLogger::LogMessageEx(LogType type, const char *vafmt, ...)
|
||||||
|
{
|
||||||
|
if (!m_Active)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (type == LogType_Normal)
|
||||||
|
{
|
||||||
|
LogMessage(vafmt);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
time_t t;
|
||||||
|
time(&t);
|
||||||
|
tm *curtime = localtime(&t);
|
||||||
|
|
||||||
|
char date[32];
|
||||||
|
strftime(date, sizeof(date), "%m/%d/%Y - %H:%M:%S", curtime);
|
||||||
|
|
||||||
|
if (curtime->tm_mday != m_CurDay)
|
||||||
|
{
|
||||||
|
char _filename[256];
|
||||||
|
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);
|
||||||
|
m_ErrFileName.assign(_filename);
|
||||||
|
m_CurDay = curtime->tm_mday;
|
||||||
|
m_ErrMapStart = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char msg[3072];
|
||||||
|
va_list ap;
|
||||||
|
va_start(ap, vafmt);
|
||||||
|
vsnprintf(msg, sizeof(msg), vafmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
FILE *fp = fopen(m_ErrFileName.c_str(), "a+");
|
||||||
|
if (fp)
|
||||||
|
{
|
||||||
|
if (!m_ErrMapStart)
|
||||||
|
{
|
||||||
|
fprintf(fp, "L %s: SourceMod error session started\n", date);
|
||||||
|
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);
|
||||||
|
m_ErrMapStart = true;
|
||||||
|
}
|
||||||
|
fprintf(fp, "L %s: %s\n", date, msg);
|
||||||
|
fclose(fp);
|
||||||
|
} else {
|
||||||
|
g_SMAPI->ConPrint("[SM] Unexpected fatal logging error. SourceMod logging disabled.\n");
|
||||||
|
m_Active = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_SMAPI->ConPrintf("L %s: %s\n", date, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CLogger::MapChange(const char *mapname)
|
||||||
|
{
|
||||||
|
m_CurMapName.assign(mapname);
|
||||||
|
|
||||||
|
switch (m_mode)
|
||||||
|
{
|
||||||
|
case LoggingMode_Daily:
|
||||||
|
{
|
||||||
|
LogMessage("-------- Mapchange to %s --------", mapname);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case LoggingMode_PerMap:
|
||||||
|
{
|
||||||
|
_NewMapFile();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_ErrMapStart)
|
||||||
|
{
|
||||||
|
LogMessageEx(LogType_Error, "Error log file session closed.");
|
||||||
|
}
|
||||||
|
m_ErrMapStart = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CLogger::_PrintToHL2Log(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
static char msg[3072];
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
va_list ap;
|
||||||
|
va_start(ap, fmt);
|
||||||
|
len = vsnprintf(msg, sizeof(msg)-1, fmt, ap);
|
||||||
|
msg[len++] = '\n';
|
||||||
|
msg[len] = '\0';
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
engine->LogPrint(msg);
|
||||||
|
}
|
101
core/CLogger.h
Normal file
101
core/CLogger.h
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
#ifndef _INCLUDE_SOURCEMOD_CLOGGER_H_
|
||||||
|
#define _INCLUDE_SOURCEMOD_CLOGGER_H_
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
#include "sourcemm_api.h"
|
||||||
|
#include <sh_string.h>
|
||||||
|
#include "sourcemod.h"
|
||||||
|
#include "sm_version.h"
|
||||||
|
|
||||||
|
using namespace SourceHook;
|
||||||
|
|
||||||
|
enum LogType
|
||||||
|
{
|
||||||
|
LogType_Normal,
|
||||||
|
LogType_Error
|
||||||
|
};
|
||||||
|
|
||||||
|
enum LoggingMode
|
||||||
|
{
|
||||||
|
LoggingMode_Daily,
|
||||||
|
LoggingMode_PerMap,
|
||||||
|
LoggingMode_HL2
|
||||||
|
};
|
||||||
|
|
||||||
|
class CLogger
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CLogger() : m_ErrMapStart(false), m_Active(false), m_DelayedStart(false), m_DailyPrintHdr(false) {}
|
||||||
|
public:
|
||||||
|
void InitLogger(LoggingMode mode, bool startlogging);
|
||||||
|
void CloseLogger();
|
||||||
|
void EnableLogging();
|
||||||
|
void DisableLogging();
|
||||||
|
void LogMessage(const char *msg, ...);
|
||||||
|
void LogMessageEx(LogType type, const char *msg, ...);
|
||||||
|
void MapChange(const char *mapname);
|
||||||
|
const char *GetLogFileName(LogType type);
|
||||||
|
LoggingMode GetLoggingMode();
|
||||||
|
private:
|
||||||
|
void _CloseFile();
|
||||||
|
void _NewMapFile();
|
||||||
|
void _PrintToHL2Log(const char *fmt, ...);
|
||||||
|
private:
|
||||||
|
String m_NrmFileName;
|
||||||
|
String m_ErrFileName;
|
||||||
|
String m_CurMapName;
|
||||||
|
LoggingMode m_mode;
|
||||||
|
int m_CurDay;
|
||||||
|
bool m_ErrMapStart;
|
||||||
|
bool m_Active;
|
||||||
|
bool m_DelayedStart;
|
||||||
|
bool m_DailyPrintHdr;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern CLogger g_Logger;
|
||||||
|
|
||||||
|
inline const char *CLogger::GetLogFileName(LogType type)
|
||||||
|
{
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case LogType_Normal:
|
||||||
|
{
|
||||||
|
return m_NrmFileName.c_str();
|
||||||
|
}
|
||||||
|
case LogType_Error:
|
||||||
|
{
|
||||||
|
return m_ErrFileName.c_str();
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline LoggingMode CLogger::GetLoggingMode()
|
||||||
|
{
|
||||||
|
return m_mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void CLogger::EnableLogging()
|
||||||
|
{
|
||||||
|
if (m_Active)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_Active = true;
|
||||||
|
LogMessage("Logging enabled manually by user.");
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void CLogger::DisableLogging()
|
||||||
|
{
|
||||||
|
if (!m_Active)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
LogMessage("Logging disabled manually by user.");
|
||||||
|
m_Active = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // _INCLUDE_SOURCEMOD_CLOGGER_H_
|
Loading…
Reference in New Issue
Block a user