#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules #include "cLog.h" #include #include #include "cMakeDir.h" #include "cIsThread.h" #if defined(ANDROID_NDK) #include #endif cLog* cLog::s_Log = NULL; cLog::cLog(const AString & a_FileName ) : m_File(NULL) { s_Log = this; // create logs directory cMakeDir::MakeDir("logs"); OpenLog( (std::string("logs/") + a_FileName).c_str() ); } cLog::~cLog() { CloseLog(); s_Log = NULL; } cLog* cLog::GetInstance() { if(s_Log) return s_Log; new cLog("log.txt"); return s_Log; } void cLog::CloseLog() { if( m_File ) fclose (m_File); m_File = 0; } void cLog::OpenLog( const char* a_FileName ) { if(m_File) fclose (m_File); #ifdef _WIN32 fopen_s( &m_File, a_FileName, "a+" ); #else m_File = fopen(a_FileName, "a+" ); #endif } void cLog::ClearLog() { #ifdef _WIN32 if( fopen_s( &m_File, "log.txt", "w" ) == 0) fclose (m_File); #else m_File = fopen("log.txt", "w" ); if( m_File ) fclose (m_File); #endif m_File = 0; } void cLog::Log(const char * a_Format, va_list argList) { #if defined(ANDROID_NDK) __android_log_vprint(ANDROID_LOG_ERROR,"MCServer", a_Format, argList); return; // This is as far as android goes #endif AString Message; AppendVPrintf(Message, a_Format, argList); time_t rawtime; time ( &rawtime ); struct tm* timeinfo; #ifdef _WIN32 struct tm timeinforeal; timeinfo = &timeinforeal; localtime_s(timeinfo, &rawtime ); #else timeinfo = localtime( &rawtime ); #endif AString Line; #ifdef _DEBUG Printf(Line, "[%04x|%02d:%02d:%02d] %s\n", cIsThread::GetCurrentID(), timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, Message.c_str()); #else Printf(Line, "[%02d:%02d:%02d] %s\n", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, Message.c_str()); #endif if (m_File) { fputs(Line.c_str(), m_File); fflush(m_File); } // Print to console: printf("%s", Line.c_str()); #if defined (_WIN32) && defined(_DEBUG) // In a Windows Debug build, output the log to debug console as well: OutputDebugString(Line.c_str()); #endif // _WIN32 } void cLog::Log(const char* a_Format, ...) { va_list argList; va_start(argList, a_Format); Log( a_Format, argList ); va_end(argList); } void cLog::SimpleLog(const char* a_String) { Log("%s", a_String ); }