53 Log::Log() : m_gmlog_per_account(
false), m_logMask(0), m_logMaskDatabase(0)
63 std::set<FILE*> openfiles;
69 for (std::set<FILE*>::iterator i = openfiles.begin(); i != openfiles.end(); ++i)
89 m_logsDir =
sConfig.GetStringDefault(
"LogsDir",
"0 6 4 3 1 1 2 7 5 0 4 0 1 3 2 4 0");
97 FILE* logfile =
openLogFile(
"LogFile",
"LogTimestamp",
"wb");
103 InitColors(
sConfig.GetStringDefault(
"LogColors",
"0 6 4 3 1 1 2 7 5 0 4 0 1 3 2 4 0"));
106 if (!m_gmlog_per_account)
114 bool m_gmlog_timestamp =
sConfig.GetBoolDefault(
"GmLogTimestamp",
false);
119 if (m_gmlog_timestamp)
128 if (m_gmlog_timestamp)
153 switch (
sConfig.GetIntDefault(
"LogLevel", -1))
177 switch (
sConfig.GetIntDefault(
"DBLogLevel", -1))
208 FILE*
Log::openLogFile(
char const* configFileName,
char const* configTimeStampFlag,
char const* mode)
210 std::string logfn =
sConfig.GetStringDefault(configFileName,
"");
214 if (configTimeStampFlag &&
sConfig.GetBoolDefault(configTimeStampFlag,
false))
216 size_t dot_pos = logfn.find_last_of(
".");
217 if (dot_pos != logfn.npos)
223 return fopen((
m_logsDir + logfn).c_str(), mode);
238 return fopen(namebuf,
"ab");
243 time_t t = time(NULL);
244 tm* aTm = localtime(&t);
251 fprintf(file,
"%-4d-%02d-%02d %02d:%02d:%02d ", aTm->tm_year + 1900, aTm->tm_mon + 1, aTm->tm_mday, aTm->tm_hour, aTm->tm_min, aTm->tm_sec);
256 std::stringstream ss(str);
263 if (ss.eof() || ss.fail() || ss.bad())
279 #if defined(__PDCURSES__) && !defined(PDC_RGB) 281 int clr = int(color);
282 int rgb = (clr & 0x07);
284 clr |= (rgb & 0x1) << 2;
286 clr |= (rgb & 0x4) >> 2;
289 fputc((
char) color, stderr);
293 #if PLATFORM == PLATFORM_WINDOWS 299 FOREGROUND_RED | FOREGROUND_GREEN,
301 FOREGROUND_RED | FOREGROUND_BLUE,
302 FOREGROUND_GREEN | FOREGROUND_BLUE,
303 FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE,
304 FOREGROUND_INTENSITY,
305 FOREGROUND_RED | FOREGROUND_INTENSITY,
306 FOREGROUND_GREEN | FOREGROUND_INTENSITY,
307 FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY,
308 FOREGROUND_BLUE | FOREGROUND_INTENSITY,
309 FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY,
310 FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY,
311 FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY
314 SetConsoleTextAttribute(GetStdHandle(STD_ERROR_HANDLE), WinColorFG[color]);
349 fprintf(stderr,
"\x1b[%s%dm", ((color > 7) ?
"01;" :
"00;"), UnixColorFG[color]);
362 #if PLATFORM == PLATFORM_WINDOWS 363 SetConsoleTextAttribute(GetStdHandle(STD_ERROR_HANDLE), FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED);
365 fprintf(stderr,
"\x1b[0m");
371 time_t t = time(NULL);
372 tm* aTm = localtime(&t);
377 snprintf(buf, 20,
"%04d-%02d-%02d", aTm->tm_year + 1900, aTm->tm_mon + 1, aTm->tm_mday);
378 return std::string(buf);
386 std::string new_str(str);
401 void Log::DoLog(
LogTypes type,
bool newline,
const char* prefix,
const char* fmt, va_list ap, FILE* file)
406 size_t len =
vsnprintf(NULL, 0, fmt, ap2) + 1;
407 char* buffer = (
char*) ((len > 1024) ? malloc(len *
sizeof(
char)) : alloca(len *
sizeof(
char)));
410 vsprintf(buffer, fmt, ap);
415 if (*buffer && *buffer !=
' ' && *buffer !=
'\n')
421 if (FILE* logFile = (file ? file :
m_logFiles[type]))
424 fwrite(buffer, len-1, 1, logFile);
426 fputc(
'\n', logFile);
432 if (colorPrefixTable[
m_colors[type]])
435 fprintf(stderr,
"[%s] ", prefix);
441 #if PLATFORM == PLATFORM_WINDOWS 442 wchar_t* wtemp_buf = (
wchar_t*) _malloca(len *
sizeof(
wchar_t));
443 size_t siz = len - 1;
444 if (
Utf8toWStr(buffer, len-1, wtemp_buf, siz))
446 CharToOemBuffW(wtemp_buf, buffer, siz);
447 fwrite(buffer, siz, 1, stderr);
451 fwrite(buffer, len-1, 1, stderr);
472 size_t len =
vsnprintf(NULL, 0, err, ap) + 1;
473 char* buffer = (
char*) alloca(len);
474 buffer[len - 1] =
'\0';
477 vsprintf(buffer, err, ap);
516 fprintf(
m_logFiles[LOG_TYPE_CHAR],
"== START DUMP == (account: %u guid: %u name: %s)\n%s\n== END DUMP ==\n", account_id, guid, name, str);
521 #define logFunctionImpl(name, type, newline, prefix) \ 522 void Log::name(const char* fmt, ...) \ 524 if (!((m_logMask | m_logMaskDatabase) & (1 << type))) \ 529 DoLog(type, newline, prefix, fmt, ap, NULL); \ 558 #undef logFunctionImpl void SetColor(ColorTypes color)
Sets color for upcoming output.
void void outFatal(const char *err,...) ATTR_PRINTF(2
void void outBasic(const char *fmt,...) ATTR_PRINTF(2
bool m_gmlog_per_account
flag: create separate log for every GM account?
std::string m_logsDir
directory to put log files in
void outDebugInLine(const char *fmt,...) ATTR_PRINTF(2
void void void void void void void outSQL(const char *fmt,...) ATTR_PRINTF(2
void outCharDump(const char *str, uint32 account_id, uint32 guid, const char *name)
NULL Dbg ErrDB Arena Chat LOG_TYPE_CHAR
LogTypes
LogTypes, each value is bit position in logmask.
void void void void void void void void outArena(const char *fmt,...) ATTR_PRINTF(2
void DoLog(LogTypes type, bool newline, const char *prefix, const char *fmt, va_list ap, FILE *file=NULL)
Performs logging.
unsigned long m_logMask
mask to filter messages sent to console and files
uint32 realmID
Id of the realm.
std::string m_gmlog_filename_format
format for GM log filename
static std::string GetTimestampStr()
void void void void void void void void void void void void void outRemote(const char *fmt,...) ATTR_PRINTF(2
unsigned long escape_string(char *to, const char *from, unsigned long length)
NULL Dbg ErrDB Arena Chat Char Map MMap false
void static void outTimestamp(FILE *file)
void void void outDetail(const char *fmt,...) ATTR_PRINTF(2
NULL Dbg ErrDB Arena Chat Char LOG_TYPE_MAP
bool Utf8toWStr(char const *utf8str, size_t csize, wchar_t *wstr, size_t &wsize)
std::string m_logsTimestamp
FILE * m_logFiles[MAX_LOG_TYPES]
files for each message type
NULL Dbg ErrDB Arena LOG_TYPE_CHAT
ColorTypes m_colors[MAX_LOG_TYPES]
colors assigned to individual message types
NULL Dbg ErrDB Arena Chat Char Map LOG_TYPE_MMAP
void SetLogMask(unsigned long mask)
DatabaseType LoginDatabase
Accessor to the realm/login database.
void InitColors(const std::string &init_str)
void SetDBLogMask(unsigned long mask)
INSTANTIATE_SINGLETON_1(Log)
bool PExecute(const char *format,...) ATTR_PRINTF(2
#define logFunctionImpl(name, type, newline, prefix)
void void void void void void outErrorDb(const char *fmt,...) ATTR_PRINTF(2
void void void void void void void void void void void void void void void void void outNetwork(const char *fmt,...) ATTR_PRINTF(2
void void void void void void void void void void void void void void void void outMMap(const char *fmt,...) ATTR_PRINTF(2
void ResetColor()
Resets output color to normal.
void void void void outDebug(const char *fmt,...) ATTR_PRINTF(2
FILE * openGmlogPerAccount(uint64 account)
opens specific file for account
void void void void void void void void void void void void outChar(const char *fmt,...) ATTR_PRINTF(2
void void void void void void void void void void void outCommand(const char *fmt,...) ATTR_PRINTF(2
void void void void void void void void void void void void void void void void void void outDB(LogTypes type, const char *str)
void void void void void outError(const char *fmt,...) ATTR_PRINTF(2
void void void void void void void void void outWarden(const char *fmt,...) ATTR_PRINTF(2
unsigned long m_logMaskDatabase
mask to filter messages sent to db
void void void void void void void void void void outChat(const char *fmt,...) ATTR_PRINTF(2
NULL Dbg LOG_TYPE_ERROR_DB
NULL Dbg ErrDB LOG_TYPE_ARENA
void void void void void void void void void void void void void void void outVMap(const char *fmt,...) ATTR_PRINTF(2
FILE * openLogFile(char const *configFileName, char const *configTimeStampFlag, char const *mode)
void void void void void void void void void void void void void void outMap(const char *fmt,...) ATTR_PRINTF(2