Save log to file, closes #696

dev-time-step
krzys-h 2016-02-13 20:32:26 +01:00
parent 6dc7d892b7
commit 254891d8f1
3 changed files with 47 additions and 53 deletions

View File

@ -92,11 +92,19 @@ extern "C"
int main(int argc, char *argv[])
{
CLogger logger; // single instance of logger
logger.AddOutput(stderr);
auto systemUtils = CSystemUtils::Create(); // platform-specific utils
systemUtils->Init();
//logger.SetOutputFile(systemUtils->GetSaveDir() + "/log.txt");
// Add file output to the logger
std::string logfile;
#if DEV_BUILD
logfile = "log.txt";
#else
logfile = systemUtils->GetSaveDir() + "/log.txt";
#endif
logger.AddOutput(fopen(logfile.c_str(), "w"));
// Workaround for character encoding in argv on Windows
#if PLATFORM_WINDOWS

View File

@ -28,7 +28,6 @@ template<> CLogger* CSingleton<CLogger>::m_instance = nullptr;
CLogger::CLogger()
{
m_file = nullptr;
#if DEV_BUILD
m_logLevel = LOG_DEBUG;
#else
@ -38,7 +37,10 @@ CLogger::CLogger()
CLogger::~CLogger()
{
Close();
for (FILE* out : m_outputs)
{
fclose(out);
}
}
void CLogger::Log(LogLevel type, const char* str, va_list args)
@ -46,28 +48,34 @@ void CLogger::Log(LogLevel type, const char* str, va_list args)
if (type < m_logLevel)
return;
switch (type)
for (FILE* out : m_outputs)
{
case LOG_TRACE:
fprintf(IsOpened() ? m_file : stderr, "[TRACE]: ");
break;
case LOG_DEBUG:
fprintf(IsOpened() ? m_file : stderr, "[DEBUG]: ");
break;
case LOG_WARN:
fprintf(IsOpened() ? m_file : stderr, "[WARN]: ");
break;
case LOG_INFO:
fprintf(IsOpened() ? m_file : stderr, "[INFO]: ");
break;
case LOG_ERROR:
fprintf(IsOpened() ? m_file : stderr, "[ERROR]: ");
break;
default:
break;
}
switch (type)
{
case LOG_TRACE:
fprintf(out, "[TRACE]: ");
break;
case LOG_DEBUG:
fprintf(out, "[DEBUG]: ");
break;
case LOG_WARN:
fprintf(out, "[WARN]: ");
break;
case LOG_INFO:
fprintf(out, "[INFO]: ");
break;
case LOG_ERROR:
fprintf(out, "[ERROR]: ");
break;
default:
break;
}
vfprintf(IsOpened() ? m_file : stderr, str, args);
va_list args2;
va_copy(args2, args);
vfprintf(out, str, args2);
va_end(args2);
}
}
void CLogger::Trace(const char* str, ...)
@ -126,29 +134,10 @@ void CLogger::Log(LogLevel logLevel, const char* str, ...)
va_end(args);
}
void CLogger::SetOutputFile(std::string filename)
void CLogger::AddOutput(FILE* file)
{
m_filename = filename;
Open();
}
void CLogger::Open()
{
m_file = fopen(m_filename.c_str(), "w");
if (m_file == nullptr)
fprintf(stderr, "Could not create file %s\n", m_filename.c_str());
}
void CLogger::Close()
{
if (IsOpened())
fclose(m_file);
}
bool CLogger::IsOpened()
{
return m_file != nullptr;
assert(file != nullptr);
m_outputs.push_back(file);
}
void CLogger::SetLogLevel(LogLevel level)

View File

@ -30,6 +30,7 @@
#include <string>
#include <cstdarg>
#include <cstdio>
#include <vector>
/**
@ -104,9 +105,10 @@ public:
void Log(LogLevel logLevel, const char *str, ...);
/** Set output file to write logs to
* \param filename - output file to write to
* The given file will be automatically closed when the logger exits
* \param file - file pointer to write to
*/
void SetOutputFile(std::string filename);
void AddOutput(FILE* file);
/** Set log level. Logs with level below will not be shown
* \param level - minimum log level to write
@ -123,13 +125,8 @@ public:
static bool ParseLogLevel(const std::string& str, LogLevel& logLevel);
private:
std::string m_filename;
FILE *m_file;
std::vector<FILE*> m_outputs;
LogLevel m_logLevel;
void Open();
void Close();
bool IsOpened();
void Log(LogLevel type, const char* str, va_list args);
};