#include "Logging.h" #include #include #include #include #include #include // #include "EnumToString.h" namespace Engine { static Logging *LoggingInstance = NULL; static LogLevel requested_level = LOG_DEFAULT_LEVEL; static std::string requested_logfilename(""); /* * Inherited Module functions */ int Logging::OnInit (int argc, char* argv[]) { mPrintLevel = requested_level; if (requested_logfilename != "") SetLogFilename (requested_logfilename.c_str()); Log (LogLevelDebug, "Logging Init"); LoggingInstance = this; return 0; } void Logging::OnDestroy () { Log (LogLevelDebug, "Logging Destroy"); if (mLogFileOut) mLogFileOut.close(); LoggingInstance = NULL; } /* * Module specific functions */ void Logging::Log (LogLevel level, const char *str, ...) { static char msg[LOG_MAX_MESSAGE_LENGTH]; static int last_length = LOG_MAX_MESSAGE_LENGTH; static int i; for (i = 0; i < last_length; i++) msg[i] = 0; va_list ap; va_start(ap, str); vsprintf(msg, str, ap); va_end(ap); last_length = strlen (msg); assert (last_length < LOG_MAX_MESSAGE_LENGTH); if (level >= mPrintLevel) std::cout << msg << std::endl; LogEntry log_entry (level, msg); mLogEntries.push_back (log_entry); // write the logs to file if (mLogFileOut) { /// \TODO also write out the log level time_t timer = time(NULL); std::string timestr (asctime(localtime(&timer))); mLogFileOut << timestr.substr(0, timestr.size() - 1) << ' ' << GetStringLogLevel(level) << ": " << msg << std::endl; mLogFileOut.flush(); } if (level == LogLevelError) { std::cerr << "Error occured: Aborting!" << std::endl; mLogFileOut << "Error occured: Aborting!" << std::endl; mLogFileOut.flush(); mLogFileOut.close(); } // we abort if there was an error assert (level != LogLevelError); } void Logging::SetLogPrintLevel (LogLevel print_level) { mPrintLevel = print_level; } void Logging::SetLogFilename (const char *filename) { mLogFileOut.open (filename, std::ios_base::trunc); if (!mLogFileOut) { LogError ("Could not open logfile %s for writing!", filename); } requested_logfilename = ""; }; const LogEntry &Logging::GetLastEntry () { static LogEntry null_message (LogLevelMessage, ""); if (mLogEntries.size() > 0) { return mLogEntries[mLogEntries.size() - 1]; } return null_message; } /* * Globally visible functions */ void SetLogPrintLevel (LogLevel print_level) { if (!LoggingInstance) { requested_level = print_level; return; } LoggingInstance->SetLogPrintLevel (print_level); } void SetLogFilename (const char *filename) { if (!LoggingInstance) { requested_logfilename = filename; return; } LoggingInstance->SetLogFilename (filename); } void LogError (const char* str, ...) { assert (LoggingInstance); static char msg[LOG_MAX_MESSAGE_LENGTH]; static int last_length = LOG_MAX_MESSAGE_LENGTH; static int i; for (i = 0; i < last_length; i++) msg[i] = 0; va_list ap; va_start(ap, str); vsprintf(msg, str, ap); va_end(ap); last_length = strlen (msg); assert (last_length < LOG_MAX_MESSAGE_LENGTH); LoggingInstance->Log (LogLevelError, msg); } void LogWarning (const char* str, ...) { assert (LoggingInstance); static char msg[LOG_MAX_MESSAGE_LENGTH]; static int last_length = LOG_MAX_MESSAGE_LENGTH; static int i; for (i = 0; i < last_length; i++) msg[i] = 0; va_list ap; va_start(ap, str); vsprintf(msg, str, ap); va_end(ap); last_length = strlen (msg); assert (last_length < LOG_MAX_MESSAGE_LENGTH); LoggingInstance->Log (LogLevelWarning, msg); } void LogMessage (const char* str, ...) { assert (LoggingInstance); static char msg[LOG_MAX_MESSAGE_LENGTH]; static int last_length = LOG_MAX_MESSAGE_LENGTH; static int i; for (i = 0; i < last_length; i++) msg[i] = 0; va_list ap; va_start(ap, str); vsprintf(msg, str, ap); va_end(ap); last_length = strlen (msg); assert (last_length < LOG_MAX_MESSAGE_LENGTH); LoggingInstance->Log (LogLevelMessage, msg); } void LogDebug (const char* str, ...) { assert (LoggingInstance); static char msg[LOG_MAX_MESSAGE_LENGTH]; static int last_length = LOG_MAX_MESSAGE_LENGTH; static int i; for (i = 0; i < last_length; i++) msg[i] = 0; va_list ap; va_start(ap, str); vsprintf(msg, str, ap); va_end(ap); last_length = strlen (msg); assert (last_length < LOG_MAX_MESSAGE_LENGTH); LoggingInstance->Log (LogLevelDebug, msg); } const LogEntry& GetLastLogEntry () { assert (LoggingInstance); return LoggingInstance->GetLastEntry (); } }