diff --git a/src/logger.cpp b/src/logger.cpp
index 5799f9734d776b6995dea810fc7e0774ecaf7f47..f3bc407830a07c7701f684ff62e3122aab980038 100644
--- a/src/logger.cpp
+++ b/src/logger.cpp
@@ -103,28 +103,60 @@ stripDirName(const char* path)
 static std::string
 contextHeader(const char* const file, int line)
 {
+    static char* timestamp_fmt = getenv("JAMI_TIMESTAMP_FMT");
+
 #ifdef __linux__
     auto tid = syscall(__NR_gettid) & 0xffff;
 #else
     auto tid = std::this_thread::get_id();
 #endif // __linux__
+
+    std::ostringstream out;
+
+    out << '[';
+
     // Timestamp
-    unsigned int secs, milli;
-    struct timeval tv;
+    if (timestamp_fmt) {
+
+        time_t t;
+        struct tm tm;
+        char buf[128];
+
+        time(&t);
+
+#ifdef _WIN32
+        /* NOTE!  localtime(3) is MT-Safe on win32 */
+        tm = *localtime(&t);
+#else
+        localtime_r(&t, &tm);
+#endif
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+        strftime(buf, sizeof(buf), timestamp_fmt, &tm);
+#pragma GCC diagnostic pop
+
+        out << buf;
 
-    if (!gettimeofday(&tv, NULL)) {
-        secs = tv.tv_sec;
-        milli = tv.tv_usec / 1000; // suppose that milli < 1000
     } else {
-        secs = time(NULL);
-        milli = 0;
-    }
 
-    std::ostringstream out;
-    const auto prev_fill = out.fill();
-    out << '[' << secs << '.' << std::right << std::setw(3) << std::setfill('0') << milli
-        << std::left << '|' << std::right << std::setw(5) << std::setfill(' ') << tid << std::left;
-    out.fill(prev_fill);
+        unsigned int secs, milli;
+        struct timeval tv;
+
+        if (!gettimeofday(&tv, NULL)) {
+            secs = tv.tv_sec;
+            milli = tv.tv_usec / 1000; // suppose that milli < 1000
+        } else {
+            secs = time(NULL);
+            milli = 0;
+        }
+
+        const auto prev_fill = out.fill();
+
+        out << secs << '.' << std::right << std::setw(3) << std::setfill('0') << milli
+            << std::left << '|' << std::right << std::setw(5) << std::setfill(' ') << tid << std::left;
+        out.fill(prev_fill);
+    }
 
     // Context
     if (file) {