aboutsummaryrefslogtreecommitdiff
path: root/src/shared/Log.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared/Log.cpp')
-rw-r--r--src/shared/Log.cpp166
1 files changed, 166 insertions, 0 deletions
diff --git a/src/shared/Log.cpp b/src/shared/Log.cpp
index e842949d08e..89544a82426 100644
--- a/src/shared/Log.cpp
+++ b/src/shared/Log.cpp
@@ -17,14 +17,18 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+
#include "Common.h"
#include "Log.h"
#include "Policies/SingletonImp.h"
#include "Config/ConfigEnv.h"
#include "Util.h"
+
#include <stdarg.h>
#include <stdio.h>
+
INSTANTIATE_SINGLETON_1( Log );
+
Log::Log() :
raLogfile(NULL), logfile(NULL), gmLogfile(NULL), charLogfile(NULL),
dberLogfile(NULL), chatLogfile(NULL), m_gmlog_per_account(false), m_colored(false)
@@ -32,54 +36,68 @@ Log::Log() :
{
Initialize();
}
+
Log::~Log()
{
if( logfile != NULL )
fclose(logfile);
logfile = NULL;
+
if( gmLogfile != NULL )
fclose(gmLogfile);
gmLogfile = NULL;
+
if (charLogfile != NULL)
fclose(charLogfile);
charLogfile = NULL;
+
if( dberLogfile != NULL )
fclose(dberLogfile);
dberLogfile = NULL;
+
if (raLogfile != NULL)
fclose(raLogfile);
raLogfile = NULL;
+
if (chatLogfile != NULL)
fclose(chatLogfile);
chatLogfile = NULL;
+
if (arenaLogFile != NULL)
fclose(arenaLogFile);
arenaLogFile = NULL;
}
+
void Log::SetLogLevel(char *Level)
{
int32 NewLevel =atoi((char*)Level);
if ( NewLevel <0 )
NewLevel = 0;
m_logLevel = NewLevel;
+
outString( "LogLevel is %u",m_logLevel );
}
+
void Log::SetLogFileLevel(char *Level)
{
int32 NewLevel =atoi((char*)Level);
if ( NewLevel <0 )
NewLevel = 0;
m_logFileLevel = NewLevel;
+
outString( "LogFileLevel is %u",m_logFileLevel );
}
+
void Log::SetDBLogLevel(char *Level)
{
int32 NewLevel = atoi((char*)Level);
if ( NewLevel < 0 )
NewLevel = 0;
m_dbLogLevel = NewLevel;
+
outString( "DBLogLevel is %u",m_dbLogLevel );
}
+
void Log::Initialize()
{
/// Check whether we'll log GM commands/RA events/character outputs/chat stuffs
@@ -87,8 +105,10 @@ void Log::Initialize()
m_dbRA = sConfig.GetBoolDefault("LogDB.RA", false);
m_dbGM = sConfig.GetBoolDefault("LogDB.GM", false);
m_dbChat = sConfig.GetBoolDefault("LogDB.Chat", false);
+
/// Realm must be 0 by default
SetRealmID(0);
+
/// Common log files data
m_logsDir = sConfig.GetStringDefault("LogsDir","");
if(!m_logsDir.empty())
@@ -96,10 +116,13 @@ void Log::Initialize()
if((m_logsDir.at(m_logsDir.length()-1)!='/') && (m_logsDir.at(m_logsDir.length()-1)!='\\'))
m_logsDir.append("/");
}
+
m_logsTimestamp = "_" + GetTimestampStr();
+
/// Open specific log files
logfile = openLogFile("LogFile","LogTimestamp","w");
InitColors(sConfig.GetStringDefault("LogColors", ""));
+
m_gmlog_per_account = sConfig.GetBoolDefault("GmLogPerAccount",false);
if(!m_gmlog_per_account)
gmLogfile = openLogFile("GMLogFile","GmLogTimestamp","a");
@@ -110,32 +133,41 @@ void Log::Initialize()
if(!m_gmlog_filename_format.empty())
{
bool m_gmlog_timestamp = sConfig.GetBoolDefault("GmLogTimestamp",false);
+
size_t dot_pos = m_gmlog_filename_format.find_last_of(".");
if(dot_pos!=m_gmlog_filename_format.npos)
{
if(m_gmlog_timestamp)
m_gmlog_filename_format.insert(dot_pos,m_logsTimestamp);
+
m_gmlog_filename_format.insert(dot_pos,"_#%u");
}
else
{
m_gmlog_filename_format += "_#%u";
+
if(m_gmlog_timestamp)
m_gmlog_filename_format += m_logsTimestamp;
}
+
m_gmlog_filename_format = m_logsDir + m_gmlog_filename_format;
}
}
+
charLogfile = openLogFile("CharLogFile","CharLogTimestamp","a");
+
dberLogfile = openLogFile("DBErrorLogFile",NULL,"a");
raLogfile = openLogFile("RaLogFile",NULL,"a");
chatLogfile = openLogFile("ChatLogFile","ChatLogTimestamp","a");
arenaLogFile = openLogFile("ArenaLogFile",NULL,"a");
+
// Main log file settings
m_logLevel = sConfig.GetIntDefault("LogLevel", LOGL_NORMAL);
m_logFileLevel = sConfig.GetIntDefault("LogFileLevel", LOGL_NORMAL);
m_dbLogLevel = sConfig.GetIntDefault("DBLogLevel", LOGL_NORMAL);
+
m_logFilter = 0;
+
if(sConfig.GetBoolDefault("LogFilter_TransportMoves", true))
m_logFilter |= LOG_FILTER_TRANSPORT_MOVES;
if(sConfig.GetBoolDefault("LogFilter_CreatureMoves", true))
@@ -144,14 +176,18 @@ void Log::Initialize()
m_logFilter |= LOG_FILTER_VISIBILITY_CHANGES;
if(sConfig.GetBoolDefault("LogFilter_AchievementUpdates", true))
m_logFilter |= LOG_FILTER_ACHIEVEMENT_UPDATES;
+
// Char log settings
m_charLog_Dump = sConfig.GetBoolDefault("CharLogDump", false);
+
}
+
FILE* Log::openLogFile(char const* configFileName,char const* configTimeStampFlag, char const* mode)
{
std::string logfn=sConfig.GetStringDefault(configFileName, "");
if(logfn.empty())
return NULL;
+
if(configTimeStampFlag && sConfig.GetBoolDefault(configTimeStampFlag,false))
{
size_t dot_pos = logfn.find_last_of(".");
@@ -160,16 +196,20 @@ FILE* Log::openLogFile(char const* configFileName,char const* configTimeStampFla
else
logfn += m_logsTimestamp;
}
+
return fopen((m_logsDir+logfn).c_str(), mode);
}
+
FILE* Log::openGmlogPerAccount(uint32 account)
{
if(m_gmlog_filename_format.empty())
return NULL;
+
char namebuf[TRINITY_PATH_MAX];
snprintf(namebuf,TRINITY_PATH_MAX,m_gmlog_filename_format.c_str(),account);
return fopen(namebuf, "a");
}
+
void Log::outTimestamp(FILE* file)
{
time_t t = time(NULL);
@@ -182,6 +222,7 @@ void Log::outTimestamp(FILE* file)
// SS seconds (2 digits 00-59)
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);
}
+
void Log::InitColors(const std::string& str)
{
if(str.empty())
@@ -189,20 +230,28 @@ void Log::InitColors(const std::string& str)
m_colored = false;
return;
}
+
int color[4];
+
std::istringstream ss(str);
+
for(uint8 i = 0; i < LogLevels; ++i)
{
ss >> color[i];
+
if(!ss)
return;
+
if(color[i] < 0 || color[i] >= Colors)
return;
}
+
for(uint8 i = 0; i < LogLevels; ++i)
m_colors[i] = ColorTypes(color[i]);
+
m_colored = true;
}
+
void Log::SetColor(bool stdout_stream, ColorTypes color)
{
#if PLATFORM == PLATFORM_WINDOWS
@@ -230,6 +279,7 @@ void Log::SetColor(bool stdout_stream, ColorTypes color)
// WHITE_BOLD
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY
};
+
HANDLE hConsole = GetStdHandle(stdout_stream ? STD_OUTPUT_HANDLE : STD_ERROR_HANDLE );
SetConsoleTextAttribute(hConsole, WinColorFG[color]);
#else
@@ -240,16 +290,19 @@ void Log::SetColor(bool stdout_stream, ColorTypes color)
TA_BLINK=5,
TA_REVERSE=7
};
+
enum ANSIFgTextAttr
{
FG_BLACK=30, FG_RED, FG_GREEN, FG_BROWN, FG_BLUE,
FG_MAGENTA, FG_CYAN, FG_WHITE, FG_YELLOW
};
+
enum ANSIBgTextAttr
{
BG_BLACK=40, BG_RED, BG_GREEN, BG_BROWN, BG_BLUE,
BG_MAGENTA, BG_CYAN, BG_WHITE
};
+
static uint8 UnixColorFG[Colors] =
{
FG_BLACK, // BLACK
@@ -268,9 +321,11 @@ void Log::SetColor(bool stdout_stream, ColorTypes color)
FG_CYAN, // LCYAN
FG_WHITE // LWHITE
};
+
fprintf((stdout_stream? stdout : stderr), "\x1b[%d%sm", UnixColorFG[color], (color >= YELLOW && color < Colors ? ";1" : ""));
#endif
}
+
void Log::ResetColor(bool stdout_stream)
{
#if PLATFORM == PLATFORM_WINDOWS
@@ -280,6 +335,7 @@ void Log::ResetColor(bool stdout_stream)
fprintf(( stdout_stream ? stdout : stderr ), "\x1b[0m");
#endif
}
+
std::string Log::GetTimestampStr()
{
time_t t = time(NULL);
@@ -294,27 +350,33 @@ std::string Log::GetTimestampStr()
snprintf(buf,20,"%04d-%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);
return std::string(buf);
}
+
void Log::outDB(LogTypes type, const char * str)
{
if (!str || type >= MAX_LOG_TYPES)
return;
+
std::string new_str(str);
if (new_str.empty())
return;
loginDatabase.escape_string(new_str);
+
loginDatabase.PExecute("INSERT INTO logs (time, realm, type, string) "
"VALUES (" UI64FMTD ", %u, %u, '%s');", uint64(time(0)), realm, type, new_str.c_str());
}
+
void Log::outString(const char * str, ...)
{
if (!str)
return;
+
if (m_enableLogDB)
{
// we don't want empty strings in the DB
std::string s(str);
if (s.empty() || s == " ")
return;
+
va_list ap2;
va_start(ap2, str);
char nnew_str[MAX_QUERY_LEN];
@@ -322,14 +384,19 @@ void Log::outString(const char * str, ...)
outDB(LOG_TYPE_STRING, nnew_str);
va_end(ap2);
}
+
if (m_colored)
SetColor(true,m_colors[LOGL_NORMAL]);
+
va_list ap;
+
va_start(ap, str);
vutf8printf(stdout, str, &ap);
va_end(ap);
+
if (m_colored)
ResetColor(true);
+
printf("\n");
if(logfile)
{
@@ -338,10 +405,12 @@ void Log::outString(const char * str, ...)
vfprintf(logfile, str, ap);
fprintf(logfile, "\n");
va_end(ap);
+
fflush(logfile);
}
fflush(stdout);
}
+
void Log::outString()
{
printf("\n");
@@ -353,10 +422,12 @@ void Log::outString()
}
fflush(stdout);
}
+
void Log::outCrash(const char * err, ...)
{
if (!err)
return;
+
if (m_enableLogDB)
{
va_list ap2;
@@ -366,31 +437,40 @@ void Log::outCrash(const char * err, ...)
outDB(LOG_TYPE_CRASH, nnew_str);
va_end(ap2);
}
+
if (m_colored)
SetColor(false,LRED);
+
va_list ap;
+
va_start(ap, err);
vutf8printf(stdout, err, &ap);
va_end(ap);
+
if (m_colored)
ResetColor(false);
+
fprintf(stderr, "\n");
if (logfile)
{
outTimestamp(logfile);
fprintf(logfile, "CRASH ALERT: ");
+
va_start(ap, err);
vfprintf(logfile, err, ap);
va_end(ap);
+
fprintf(logfile, "\n");
fflush(logfile);
}
fflush(stderr);
}
+
void Log::outError(const char * err, ...)
{
if (!err)
return;
+
if (m_enableLogDB)
{
va_list ap2;
@@ -400,31 +480,40 @@ void Log::outError(const char * err, ...)
outDB(LOG_TYPE_ERROR, nnew_str);
va_end(ap2);
}
+
if (m_colored)
SetColor(false,LRED);
+
va_list ap;
+
va_start(ap, err);
vutf8printf(stderr, err, &ap);
va_end(ap);
+
if (m_colored)
ResetColor(false);
+
fprintf( stderr, "\n");
if (logfile)
{
outTimestamp(logfile);
fprintf(logfile, "ERROR: ");
+
va_start(ap, err);
vfprintf(logfile, err, ap);
va_end(ap);
+
fprintf(logfile, "\n");
fflush(logfile);
}
fflush(stderr);
}
+
void Log::outArena(const char * str, ...)
{
if (!str)
return;
+
if (arenaLogFile)
{
va_list ap;
@@ -437,44 +526,57 @@ void Log::outArena(const char * str, ...)
}
fflush(stdout);
}
+
void Log::outErrorDb(const char * err, ...)
{
if (!err)
return;
+
if (m_colored)
SetColor(false,LRED);
+
va_list ap;
+
va_start(ap, err);
vutf8printf(stderr, err, &ap);
va_end(ap);
+
if (m_colored)
ResetColor(false);
+
fprintf( stderr, "\n" );
+
if (logfile)
{
outTimestamp(logfile);
fprintf(logfile, "ERROR: " );
+
va_start(ap, err);
vfprintf(logfile, err, ap);
va_end(ap);
+
fprintf(logfile, "\n" );
fflush(logfile);
}
+
if (dberLogfile)
{
outTimestamp(dberLogfile);
va_start(ap, err);
vfprintf(dberLogfile, err, ap);
va_end(ap);
+
fprintf(dberLogfile, "\n" );
fflush(dberLogfile);
}
fflush(stderr);
}
+
void Log::outBasic(const char * str, ...)
{
if (!str)
return;
+
if (m_enableLogDB && m_dbLogLevel > LOGL_NORMAL)
{
va_list ap2;
@@ -484,17 +586,22 @@ void Log::outBasic(const char * str, ...)
outDB(LOG_TYPE_BASIC, nnew_str);
va_end(ap2);
}
+
if (m_logLevel > LOGL_NORMAL)
{
if (m_colored)
SetColor(true,m_colors[LOGL_BASIC]);
+
va_list ap;
va_start(ap, str);
vutf8printf(stdout, str, &ap);
va_end(ap);
+
if (m_colored)
ResetColor(true);
+
printf("\n");
+
if (logfile)
{
outTimestamp(logfile);
@@ -508,10 +615,12 @@ void Log::outBasic(const char * str, ...)
}
fflush(stdout);
}
+
void Log::outDetail(const char * str, ...)
{
if (!str)
return;
+
if (m_enableLogDB && m_dbLogLevel > LOGL_BASIC)
{
va_list ap2;
@@ -521,17 +630,22 @@ void Log::outDetail(const char * str, ...)
outDB(LOG_TYPE_DETAIL, nnew_str);
va_end(ap2);
}
+
if (m_logLevel > LOGL_BASIC)
{
if (m_colored)
SetColor(true,m_colors[LOGL_DETAIL]);
+
va_list ap;
va_start(ap, str);
vutf8printf(stdout, str, &ap);
va_end(ap);
+
if (m_colored)
ResetColor(true);
+
printf("\n");
+
if (logfile)
{
outTimestamp(logfile);
@@ -539,24 +653,30 @@ void Log::outDetail(const char * str, ...)
va_start(ap, str);
vfprintf(logfile, str, ap);
va_end(ap);
+
fprintf(logfile, "\n");
fflush(logfile);
}
}
+
fflush(stdout);
}
+
void Log::outDebugInLine(const char * str, ...)
{
if (!str)
return;
+
if (m_logLevel > LOGL_DETAIL)
{
va_list ap;
va_start(ap, str);
vutf8printf(stdout, str, &ap);
va_end(ap);
+
//if(m_colored)
// ResetColor(true);
+
if (logfile)
{
va_list ap;
@@ -566,10 +686,12 @@ void Log::outDebugInLine(const char * str, ...)
}
}
}
+
void Log::outDebug(const char * str, ...)
{
if (!str)
return;
+
if (m_enableLogDB && m_dbLogLevel > LOGL_DETAIL)
{
va_list ap2;
@@ -579,17 +701,22 @@ void Log::outDebug(const char * str, ...)
outDB(LOG_TYPE_DEBUG, nnew_str);
va_end(ap2);
}
+
if( m_logLevel > LOGL_DETAIL )
{
if (m_colored)
SetColor(true,m_colors[LOGL_DEBUG]);
+
va_list ap;
va_start(ap, str);
vutf8printf(stdout, str, &ap);
va_end(ap);
+
if(m_colored)
ResetColor(true);
+
printf( "\n" );
+
if (logfile)
{
outTimestamp(logfile);
@@ -597,20 +724,25 @@ void Log::outDebug(const char * str, ...)
va_start(ap, str);
vfprintf(logfile, str, ap);
va_end(ap);
+
fprintf(logfile, "\n" );
fflush(logfile);
}
}
fflush(stdout);
}
+
void Log::outStringInLine(const char * str, ...)
{
if (!str)
return;
+
va_list ap;
+
va_start(ap, str);
vutf8printf(stdout, str, &ap);
va_end(ap);
+
if (logfile)
{
va_start(ap, str);
@@ -618,10 +750,12 @@ void Log::outStringInLine(const char * str, ...)
va_end(ap);
}
}
+
void Log::outCommand(uint32 account, const char * str, ...)
{
if (!str)
return;
+
// TODO: support accountid
if (m_enableLogDB && m_dbGM)
{
@@ -632,17 +766,22 @@ void Log::outCommand(uint32 account, const char * str, ...)
outDB(LOG_TYPE_GM, nnew_str);
va_end(ap2);
}
+
if (m_logLevel > LOGL_NORMAL)
{
if (m_colored)
SetColor(true,m_colors[LOGL_BASIC]);
+
va_list ap;
va_start(ap, str);
vutf8printf(stdout, str, &ap);
va_end(ap);
+
if (m_colored)
ResetColor(true);
+
printf("\n");
+
if (logfile)
{
outTimestamp(logfile);
@@ -654,6 +793,7 @@ void Log::outCommand(uint32 account, const char * str, ...)
fflush(logfile);
}
}
+
if (m_gmlog_per_account)
{
if (FILE* per_file = openGmlogPerAccount (account))
@@ -677,12 +817,15 @@ void Log::outCommand(uint32 account, const char * str, ...)
va_end(ap);
fflush(gmLogfile);
}
+
fflush(stdout);
}
+
void Log::outChar(const char * str, ...)
{
if (!str)
return;
+
if (m_enableLogDB && m_dbChar)
{
va_list ap2;
@@ -692,6 +835,7 @@ void Log::outChar(const char * str, ...)
outDB(LOG_TYPE_CHAR, nnew_str);
va_end(ap2);
}
+
if (charLogfile)
{
outTimestamp(charLogfile);
@@ -703,6 +847,7 @@ void Log::outChar(const char * str, ...)
fflush(charLogfile);
}
}
+
void Log::outCharDump(const char * str, uint32 account_id, uint32 guid, const char * name)
{
if (charLogfile)
@@ -711,10 +856,12 @@ void Log::outCharDump(const char * str, uint32 account_id, uint32 guid, const ch
fflush(charLogfile);
}
}
+
void Log::outRemote(const char * str, ...)
{
if (!str)
return;
+
if (m_enableLogDB && m_dbRA)
{
va_list ap2;
@@ -724,6 +871,7 @@ void Log::outRemote(const char * str, ...)
outDB(LOG_TYPE_RA, nnew_str);
va_end(ap2);
}
+
if (raLogfile)
{
outTimestamp(raLogfile);
@@ -736,10 +884,12 @@ void Log::outRemote(const char * str, ...)
}
fflush(stdout);
}
+
void Log::outChat(const char * str, ...)
{
if (!str)
return;
+
if (m_enableLogDB && m_dbChat)
{
va_list ap2;
@@ -749,6 +899,7 @@ void Log::outChat(const char * str, ...)
outDB(LOG_TYPE_CHAT, nnew_str);
va_end(ap2);
}
+
if (chatLogfile)
{
outTimestamp(chatLogfile);
@@ -761,59 +912,74 @@ void Log::outChat(const char * str, ...)
}
fflush(stdout);
}
+
void outstring_log(const char * str, ...)
{
if (!str)
return;
+
char buf[256];
va_list ap;
va_start(ap, str);
vsnprintf(buf,256, str, ap);
va_end(ap);
+
Trinity::Singleton<Log>::Instance().outString(buf);
}
+
void detail_log(const char * str, ...)
{
if (!str)
return;
+
char buf[256];
va_list ap;
va_start(ap, str);
vsnprintf(buf,256, str, ap);
va_end(ap);
+
Trinity::Singleton<Log>::Instance().outDetail(buf);
}
+
void debug_log(const char * str, ...)
{
if (!str)
return;
+
char buf[256];
va_list ap;
va_start(ap, str);
vsnprintf(buf,256, str, ap);
va_end(ap);
+
Trinity::Singleton<Log>::Instance().outDebug(buf);
}
+
void error_log(const char * str, ...)
{
if (!str)
return;
+
char buf[256];
va_list ap;
va_start(ap, str);
vsnprintf(buf,256, str, ap);
va_end(ap);
+
Trinity::Singleton<Log>::Instance().outError(buf);
}
+
void error_db_log(const char * str, ...)
{
if (!str)
return;
+
char buf[256];
va_list ap;
va_start(ap, str);
vsnprintf(buf,256, str, ap);
va_end(ap);
+
Trinity::Singleton<Log>::Instance().outErrorDb(buf);
}