diff --git a/src/logger.cpp b/src/logger.cpp
index 063308346bec81a8207a1f198c41b4f262009bf5..478a9d5fc67dbfe76fd38ca50cabf73a1500f8f3 100644
--- a/src/logger.cpp
+++ b/src/logger.cpp
@@ -62,19 +62,6 @@
 #endif /* APP_NAME */
 #endif
 
-#define BLACK         "\033[22;30m"
-#define GREEN         "\033[22;32m"
-#define BROWN         "\033[22;33m"
-#define BLUE          "\033[22;34m"
-#define MAGENTA       "\033[22;35m"
-#define GREY          "\033[22;37m"
-#define DARK_GREY     "\033[01;30m"
-#define LIGHT_RED     "\033[01;31m"
-#define LIGHT_SCREEN  "\033[01;32m"
-#define LIGHT_BLUE    "\033[01;34m"
-#define LIGHT_MAGENTA "\033[01;35m"
-#define LIGHT_CYAN    "\033[01;36m"
-#define WHITE         "\033[01;37m"
 #define END_COLOR     "\033[0m"
 
 #ifndef _WIN32
@@ -133,13 +120,14 @@ strErr()
 static const char*
 stripDirName(const char* path)
 {
-    const char* occur = strrchr(path, DIR_SEPARATOR_CH);
-
-    return occur ? occur + 1 : path;
+    if (path) {
+        const char* occur = strrchr(path, DIR_SEPARATOR_CH);
+        return occur ? occur + 1 : path;
+    } else return nullptr;
 }
 
-static std::string
-contextHeader(const char* const file, int line)
+std::string
+formatHeader(const char* const file, int line)
 {
 #ifdef __linux__
     auto tid = syscall(__NR_gettid) & 0xffff;
@@ -202,29 +190,37 @@ struct Logger::Msg
     Msg() = delete;
 
     Msg(int level, const char* file, int line, bool linefeed, std::string&& message)
-        : payload_(std::move(message))
-        , header_(contextHeader(file, line))
+        : file_(stripDirName(file))
+        , line_(line)
+        , payload_(std::move(message))
         , level_(level)
         , linefeed_(linefeed)
     {}
 
     Msg(int level, const char* file, int line, bool linefeed, const char* fmt, va_list ap)
-        : payload_(formatPrintfArgs(fmt, ap))
-        , header_(contextHeader(file, line))
+        : file_(stripDirName(file))
+        , line_(line)
+        , payload_(formatPrintfArgs(fmt, ap))
         , level_(level)
         , linefeed_(linefeed)
     {}
 
     Msg(Msg&& other)
     {
+        file_ = other.file_;
+        line_ = other.line_;
         payload_ = std::move(other.payload_);
-        header_ = std::move(other.header_);
         level_ = other.level_;
         linefeed_ = other.linefeed_;
     }
 
+    inline std::string header() const {
+        return formatHeader(file_, line_);
+    }
+
+    const char* file_;
+    unsigned line_;
     std::string payload_;
-    std::string header_;
     int level_;
     bool linefeed_;
 };
@@ -255,7 +251,7 @@ public:
     }
 
 #ifdef _WIN32
-    void printLogImpl(jami::Logger::Msg& msg, bool with_color)
+    void printLogImpl(Logger::Msg& msg, bool with_color)
     {
         // If we are using Visual Studio, we can use OutputDebugString to print
         // to the "Output" window. Otherwise, we just use fputs to stderr.
@@ -274,6 +270,7 @@ public:
 
         WORD saved_attributes;
         static HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
+        auto header = msg.header();
         if (with_color) {
             static WORD color_header = CYAN;
             WORD color_prefix = LIGHT_GREEN;
@@ -293,12 +290,12 @@ public:
             saved_attributes = consoleInfo.wAttributes;
             SetConsoleTextAttribute(hConsole, color_header);
 
-            printFunc(msg.header_.c_str());
+            printFunc(header.c_str());
 
             SetConsoleTextAttribute(hConsole, saved_attributes);
             SetConsoleTextAttribute(hConsole, color_prefix);
         } else {
-            printFunc(msg.header_.c_str());
+            printFunc(header.c_str());
         }
 
         printFunc(msg.payload_.c_str());
@@ -312,8 +309,9 @@ public:
         }
     }
 #else
-    void printLogImpl(jami::Logger::Msg& msg, bool with_color)
+    void printLogImpl(const Logger::Msg& msg, bool with_color)
     {
+        auto header = msg.header();
         if (with_color) {
             const char* color_header = CYAN;
             const char* color_prefix = "";
@@ -329,26 +327,25 @@ public:
             }
 
             fputs(color_header, stderr);
-            fputs(msg.header_.c_str(), stderr);
+            fwrite(header.c_str(), 1, header.size(), stderr);
             fputs(END_COLOR, stderr);
             fputs(color_prefix, stderr);
         } else {
-            fputs(msg.header_.c_str(), stderr);
+            fwrite(header.c_str(), 1, header.size(), stderr);
         }
 
         fputs(msg.payload_.c_str(), stderr);
 
-        if (msg.linefeed_) {
-            putc(ENDL, stderr);
-        }
-
         if (with_color) {
             fputs(END_COLOR, stderr);
         }
+        if (msg.linefeed_) {
+            putc(ENDL, stderr);
+        }
     }
 #endif /* _WIN32 */
 
-    virtual void consume(jami::Logger::Msg& msg) override
+    void consume(Logger::Msg& msg) override
     {
         static bool with_color = !(getenv("NO_COLOR") || getenv("NO_COLORS") || getenv("NO_COLOUR")
                                    || getenv("NO_COLOURS"));
@@ -406,10 +403,10 @@ public:
 #endif /* _WIN32 */
     }
 
-    virtual void consume(Logger::Msg& msg) override
+    void consume(Logger::Msg& msg) override
     {
 #ifdef __ANDROID__
-        __android_log_print(msg.level_, APP_NAME, "%s%s", msg.header_.c_str(), msg.payload_.c_str());
+        __android_log_write(msg.level_, msg.file_, msg.payload_.c_str());
 #else
         ::syslog(msg.level_, "%.*s", (int) msg.payload_.size(), msg.payload_.data());
 #endif
@@ -433,15 +430,10 @@ public:
         return *self;
     }
 
-    virtual void consume(jami::Logger::Msg& msg) override
+    void consume(Logger::Msg& msg) override
     {
-        /*
-         * TODO - Maybe change the MessageSend sigature to avoid copying
-         * of message payload?
-         */
-        auto tmp = msg.header_ + msg.payload_;
-
-        jami::emitSignal<libjami::ConfigurationSignal::MessageSend>(tmp);
+        auto message = msg.header() + msg.payload_;
+        emitSignal<libjami::ConfigurationSignal::MessageSend>(message);
     }
 };
 
@@ -493,6 +485,7 @@ public:
                 do_consume(file, pendingQ_);
                 pendingQ_.clear();
             }
+            file.close();
         });
     }
 
@@ -503,7 +496,7 @@ public:
             thread_.join();
     }
 
-    virtual void consume(Logger::Msg& msg) override
+    void consume(Logger::Msg& msg) override
     {
         notify([&, this] { currentQ_.emplace_back(std::move(msg)); });
     }
@@ -520,8 +513,7 @@ private:
     void do_consume(std::ofstream& file, const std::vector<Logger::Msg>& messages)
     {
         for (const auto& msg : messages) {
-            file << msg.header_ << msg.payload_;
-
+            file << msg.header() << msg.payload_;
             if (msg.linefeed_)
                 file << ENDL;
         }