#include #include #include #include #include "Logger.h" using std::string; LogLevelType Logger::LogLevel = TraceLevel; FILE* Logger::logFile = NULL; #ifdef DEBUG void Logger::InitLogFile() { if (logFile == NULL) { logFile = fopen("client.log", "a"); } } void Logger::Trace(string msg, ...) { va_list args; va_start(args, msg); Logger::Log(TraceLevel, msg, args); } void Logger::Debug(string msg, ...) { va_list args; va_start(args, msg); Logger::Log(DebugLevel, msg, args); } void Logger::Info(string msg, ...) { va_list args; va_start(args, msg); Logger::Log(InfoLevel, msg, args); } void Logger::Warn(string msg, ...) { va_list args; va_start(args, msg); Logger::Log(WarnLevel, msg, args); } void Logger::Error(string msg, ...) { va_list args; va_start(args, msg); Logger::Log(ErrorLevel, msg, args); } void Logger::Fatal(string msg, ...) { va_list args; va_start(args, msg); Logger::Log(FatalLevel, msg, args); } void Logger::Log(LogLevelType logLevel, string msg, ...) { va_list args; va_start(args, msg); Logger::Log(logLevel, msg, args); va_end(args); } void Logger::Log(LogLevelType logLevel, string msg, va_list args) { time_t rawtime = time(NULL); struct tm *lctime = localtime(&rawtime); char time_str[10] = {0}; strftime(time_str, 10, "%H:%M:%S", lctime); string log_level_str; switch (logLevel) { default: case TraceLevel: log_level_str = "Trace"; break; case DebugLevel: log_level_str = "Debug"; break; case InfoLevel: log_level_str = "Info"; break; case WarnLevel: log_level_str = "Warn"; break; case ErrorLevel: log_level_str = "Error"; break; case FatalLevel: log_level_str = "Fatal"; break; } char logstr[1024] = {0}; char *newfmt = new char[msg.size() + 24]; sprintf(newfmt, "[%s] %-6s: %s", time_str, log_level_str.c_str(), msg.c_str()); vsprintf(logstr, newfmt, args); fprintf(stderr, logstr); if (logFile != NULL) { fprintf(logFile, logstr); } delete [] newfmt; } #endif