fysxasteroids/engine/Logging.cc

223 lines
4.5 KiB
C++

#include "Logging.h"
#include <iostream>
#include <cstdarg>
#include <cstdlib>
#include <assert.h>
#include <ctime>
#include <fstream>
// #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 std::string &filename) {
mLogFileOut.open (filename.c_str(), std::ios_base::trunc);
if (!mLogFileOut) {
LogError ("Could not open logfile %s for writing!", filename.c_str());
}
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 std::string &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 ();
}
}