Logger: add format string input
authorAlexander Aksenov <a.aksenov@samsung.com>
Tue, 23 Oct 2018 15:40:28 +0000 (18:40 +0300)
committerAlexander Aksenov <a.aksenov@samsung.com>
Tue, 30 Oct 2018 09:40:49 +0000 (12:40 +0300)
Signed-off-by: Alexander Aksenov <a.aksenov@samsung.com>
src/debug/netcoredbg/logger.cpp
src/debug/netcoredbg/logger.h

index 5928c2d8cd22f2e536dbcd63966fac703a17d57e..1053513f44569984b27339a9d59a3a66672fb2a3 100644 (file)
@@ -1,9 +1,9 @@
 #include <string>
-#include <fstream>
 #include <sstream>
 #include <ctime>
 #include <iomanip>
 #include <chrono>
+#include <stdio.h>
 #include "logger.h"
 
 #ifdef DEBUGGER_FOR_TIZEN
 
 class DlogLogger : public LoggerImpl
 {
-    const std::string tag = "NETCOREDBG";
+    private:
+        static log_priority MapLogLevel(LogLevel level);
 
     public:
         DlogLogger() {}
         ~DlogLogger() override {}
         void log(LogLevel level, const std::string& msg) override;
+        void vlog(LogLevel level, const std::string fmt, va_list args) override;
 };
 
-void DlogLogger::log(LogLevel level, const std::string& msg)
+log_priority DlogLogger::MapLogLevel(LogLevel level)
 {
-    // Use LOG_DEBUG wisely!
-    if (level == LOG_DEBUG)
-        dlog_print(DLOG_DEBUG, tag.c_str(), "%s", msg.c_str());
-    else if (level == LOG_INFO)
-        dlog_print(DLOG_INFO, tag.c_str(), "%s", msg.c_str());
+    if (level == LOG_INFO)
+        return DLOG_INFO;
     else if (level == LOG_WARN)
-        dlog_print(DLOG_WARN, tag.c_str(), "%s", msg.c_str());
+        return DLOG_WARN;
     else if (level == LOG_ERROR)
-        dlog_print(DLOG_ERROR, tag.c_str(), "%s", msg.c_str());
+        return DLOG_ERROR;
+
+    return DLOG_DEBUG;
 }
+
+void DlogLogger::log(LogLevel level, const std::string &msg)
+{
+    dlog_print(MapLogLevel(level), "NETCOREDBG", "%s", msg.c_str());
+}
+
+void DlogLogger::vlog(LogLevel level, const std::string fmt, va_list args)
+{
+    dlog_vprint(MapLogLevel(level), "NETCOREDBG", fmt.c_str(), args);
+}
+
+
 #endif
 
 
@@ -41,7 +54,8 @@ class NoLogger : public LoggerImpl
     public:
         NoLogger() {}
         ~NoLogger() override {}
-        void log(LogLevel level, const std::string& msg) override {}
+        void log(LogLevel level, const std::string &msg) override {}
+        void vlog(LogLevel level, const std::string fmt, va_list args) override {}
 };
 
 class FileLogger : public LoggerImpl
@@ -50,14 +64,16 @@ class FileLogger : public LoggerImpl
 
     private:
         const std::string filenameBase = "netcoredbg_";
-        std::ofstream logFile;
+        FILE *logFile;
         std::time_t timeNow;
 
+        static std::string FormatMessageString(const std::string &str);
+
     public:
         FileLogger(LogLevel level);
         ~FileLogger() override;
         void log(LogLevel level, const std::string& msg) override;
-
+        void vlog(LogLevel level, const std::string fmt, va_list args) override;
 };
 
 
@@ -69,13 +85,22 @@ FileLogger::FileLogger(LogLevel level)
 
     oss << std::put_time(std::localtime(&time), "%Y_%m_%d__%H_%M_%S");
 
-    logFile.open(filenameBase + oss.str() + ".log", std::ios::out | std::ios::trunc);
+    logFile = fopen(std::string(filenameBase + oss.str() + ".log").c_str(), "w+");
     l = level;
 }
 
 FileLogger::~FileLogger()
 {
-    logFile.close();
+    fclose(logFile);
+}
+
+std::string FileLogger::FormatMessageString(const std::string &str)
+{
+    auto time = std::time(nullptr);
+    std::ostringstream oss;
+    oss << std::put_time(std::localtime(&time), "%y-%m-%d %OH:%OM:%OS") << " " << str << std::endl;
+
+    return oss.str();
 }
 
 void FileLogger::log(LogLevel level, const std::string& msg)
@@ -83,11 +108,20 @@ void FileLogger::log(LogLevel level, const std::string& msg)
     if (level < l)
         return;
 
-    auto time = std::time(nullptr);
+    if (logFile != NULL) {
+        fprintf(logFile, "%s", FormatMessageString(msg).c_str());
+        fflush(logFile);
+    }
+}
+
+void FileLogger::vlog(LogLevel level, const std::string fmt, va_list args)
+{
+    if (level < l)
+        return;
 
-    if (logFile.is_open()) {
-        logFile << std::put_time(std::localtime(&time), "%y-%m-%d %OH:%OM:%OS") << " " << msg + "\n";
-        logFile.flush();
+    if (logFile != NULL) {
+        vfprintf(logFile, FormatMessageString(fmt).c_str(), args);
+        fflush(logFile);
     }
 }
 
@@ -115,9 +149,12 @@ void Logger::setLogging(LogType type, LogLevel level)
     }
 }
 
-void Logger::log(const std::string& msg)
+void Logger::log(const std::string fmt, ...)
 {
-    logger->log(LOG_INFO, msg);
+    va_list args;
+    va_start(args, fmt);
+    logger->vlog(LOG_INFO, fmt, args);
+    va_end(args);
 }
 
 FuncLogger Logger::getFuncLogger(const std::string &func)
index ac706b907435eecd697fc587610d3dc1bdf28a31..730e9e22fe22db641c413333d304a8df5d8c1305 100644 (file)
@@ -2,6 +2,7 @@
 
 #include <string>
 #include <memory>
+#include <cstdarg>
 
 
 enum LogType {
@@ -22,6 +23,7 @@ class LoggerImpl
 {
     public:
         virtual ~LoggerImpl() {};
+        virtual void vlog(LogLevel level, const std::string fmt, va_list args) = 0;
         virtual void log(LogLevel level, const std::string& msg) = 0;
 };
 
@@ -51,7 +53,7 @@ class Logger
     public:
         Logger() {}
         static void setLogging(LogType type, LogLevel level = LOG_INFO);
-        static void log(const std::string& msg);
+        static void log(const std::string fmt, ...);
         static FuncLogger getFuncLogger(const std::string &func);
 };