[colobot] 270/377: Save log to file, closes #696

Didier Raboud odyx at moszumanska.debian.org
Wed Mar 30 13:34:26 UTC 2016


This is an automated email from the git hooks/post-receive script.

odyx pushed a commit to branch debian/master
in repository colobot.

commit 254891d8f1eecb1329dd60a7d8d583eaf174d595
Author: krzys-h <krzys_h at interia.pl>
Date:   Sat Feb 13 20:32:26 2016 +0100

    Save log to file, closes #696
---
 src/app/main.cpp      | 10 ++++++-
 src/common/logger.cpp | 77 ++++++++++++++++++++++-----------------------------
 src/common/logger.h   | 13 ++++-----
 3 files changed, 47 insertions(+), 53 deletions(-)

diff --git a/src/app/main.cpp b/src/app/main.cpp
index 04daf54..de3f842 100644
--- a/src/app/main.cpp
+++ b/src/app/main.cpp
@@ -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
diff --git a/src/common/logger.cpp b/src/common/logger.cpp
index e615bad..b5e5b9c 100644
--- a/src/common/logger.cpp
+++ b/src/common/logger.cpp
@@ -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;
+        }
+
+        va_list args2;
+        va_copy(args2, args);
+        vfprintf(out, str, args2);
+        va_end(args2);
     }
-
-    vfprintf(IsOpened() ? m_file : stderr, str, args);
 }
 
 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)
-{
-    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()
+void CLogger::AddOutput(FILE* file)
 {
-    return m_file != nullptr;
+    assert(file != nullptr);
+    m_outputs.push_back(file);
 }
 
 void CLogger::SetLogLevel(LogLevel level)
diff --git a/src/common/logger.h b/src/common/logger.h
index f207fae..e0a935d 100644
--- a/src/common/logger.h
+++ b/src/common/logger.h
@@ -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);
 };
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/colobot.git



More information about the Pkg-games-commits mailing list