/*
* Ascent MMORPG Server
* Copyright (C) 2005-2007 Ascent Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
#include "Common.h"
#include "Config/ConfigEnv.h"
#include "Log.h"
#include "NGLog.h"
#include
string FormatOutputString(const char * Prefix, const char * Description, bool useTimeStamp)
{
char p[MAX_PATH];
p[0] = 0;
time_t t = time(NULL);
tm * a = gmtime(&t);
strcat(p, Prefix);
strcat(p, "/");
strcat(p, Description);
if(useTimeStamp)
{
char ftime[100];
snprintf(ftime, 100, "-%-4d-%02d-%02d %02d-%02d-%02d", a->tm_year+1900, a->tm_mon+1, a->tm_mday, a->tm_hour, a->tm_min, a->tm_sec);
strcat(p, ftime);
}
strcat(p, ".log");
return string(p);
}
createFileSingleton( oLog );
createFileSingleton(CLog);
initialiseSingleton( WorldLog );
time_t UNIXTIME;
#ifndef WIN32
static const char* colorstrings[TBLUE+1] = {
"",
"\033[22;31m",
"\033[22;32m",
"\033[01;33m",
//"\033[22;37m",
"\033[0m",
"\033[01;37m",
"\033[22;34m",
};
#endif
void oLog::outString( const char * str, ... )
{
if(m_fileLogLevel < 0 && m_screenLogLevel < 0)
return;
va_list ap;
va_start(ap, str);
if(m_screenLogLevel >= 0)
{
vprintf(str, ap);
putc('\n', stdout);
}
va_end(ap);
}
void oLog::outError( const char * err, ... )
{
if(m_fileLogLevel < 1 && m_screenLogLevel < 1)
return;
va_list ap;
va_start(ap, err);
if(m_screenLogLevel >= 1)
{
#ifdef WIN32
SetConsoleTextAttribute(stderr_handle, FOREGROUND_RED | FOREGROUND_INTENSITY);
#else
puts(colorstrings[TRED]);
#endif
vfprintf(stderr, err, ap);
putc('\n', stderr);
#ifdef WIN32
SetConsoleTextAttribute(stderr_handle, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN);
#else
puts(colorstrings[TNORMAL]);
#endif
}
va_end(ap);
}
void oLog::outBasic( const char * str, ... )
{
if(m_fileLogLevel < 1 && m_screenLogLevel < 1)
return;
va_list ap;
va_start(ap, str);
if(m_screenLogLevel >= 1)
{
vprintf(str, ap);
putc('\n', stdout);
}
va_end(ap);
}
void oLog::outDetail( const char * str, ... )
{
if(m_fileLogLevel < 2 && m_screenLogLevel < 2)
return;
va_list ap;
va_start(ap, str);
if(m_screenLogLevel >= 2)
{
vprintf(str, ap);
putc('\n', stdout);
}
va_end(ap);
}
void oLog::outDebug( const char * str, ... )
{
if(m_fileLogLevel < 3 && m_screenLogLevel < 3)
return;
va_list ap;
va_start(ap, str);
if(m_screenLogLevel >= 3)
{
vprintf(str, ap);
putc('\n', stdout);
}
va_end(ap);
}
void oLog::outMenu( const char * str, ... )
{
va_list ap;
va_start(ap, str);
vprintf( str, ap );
va_end(ap);
fflush(stdout);
}
void oLog::Init(int32 fileLogLevel, int32 screenLogLevel)
{
m_screenLogLevel = screenLogLevel;
m_fileLogLevel = fileLogLevel;
// get error handle
#ifdef WIN32
stderr_handle = GetStdHandle(STD_ERROR_HANDLE);
stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
#endif
}
void oLog::SetScreenLoggingLevel(int32 level)
{
m_screenLogLevel = level;
}
void oLog::SetFileLoggingLevel(int32 level)
{
m_fileLogLevel = level;
}
void SessionLogWriter::write(const char* format, ...)
{
if(!m_file)
return;
va_list ap;
va_start(ap, format);
char out[32768];
time_t t = time(NULL);
tm* aTm = localtime(&t);
sprintf(out, "[%-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);
int l = strlen(out);
vsnprintf(&out[l], 32768 - l, format, ap);
fprintf(m_file, "%s\n", out);
va_end(ap);
}
WorldLog::WorldLog()
{
bEnabled = false;
m_file=NULL;
if (Config.MainConfig.GetBoolDefault("LogLevel", "World", false))
{
sLog.outString(" Enabling packetlog output to \"world.log\"");
Enable();
} else {
Disable();
}
}
void WorldLog::Enable()
{
if(bEnabled)
return;
bEnabled = true;
if(m_file != NULL)
{
Disable();
bEnabled=true;
}
m_file = fopen("world.log", "w");
}
void WorldLog::Disable()
{
if(!bEnabled)
return;
bEnabled = false;
if(!m_file)
return;
fflush(m_file);
fclose(m_file);
m_file=NULL;
}
WorldLog::~WorldLog()
{
}
void oLog::outColor(uint32 colorcode, const char * str, ...)
{
if( !str ) return;
va_list ap;
va_start(ap, str);
#ifdef WIN32
SetConsoleTextAttribute(stdout_handle, colorcode);
#else
printf(colorstrings[colorcode]);
#endif
vprintf( str, ap );
fflush(stdout);
va_end(ap);
}
void SessionLogWriter::Open()
{
m_file = fopen(m_filename, "a");
}
void SessionLogWriter::Close()
{
if(!m_file) return;
fflush(m_file);
fclose(m_file);
m_file=NULL;
}
SessionLogWriter::SessionLogWriter(const char * filename, bool open)
{
m_filename = strdup(filename);
m_file=NULL;
if(open)
Open();
}
SessionLogWriter::~SessionLogWriter()
{
if(m_file)
Close();
free(m_filename);
}