diff --git a/Modules/Core/Common/include/otbLogger.h b/Modules/Core/Common/include/otbLogger.h
index d61c22bf4afd22fa0c560fc7725bbfed5f90ecf5..3e69d173c0a9c75c0451919930fb3068b25b66e2 100644
--- a/Modules/Core/Common/include/otbLogger.h
+++ b/Modules/Core/Common/include/otbLogger.h
@@ -61,7 +61,7 @@ private:
   Logger(const Self &); //purposely not implemented
   void operator =(const Self&); //purposely not implemented
 
-  static Pointer Singleton;
+  static Pointer CreateInstance();
 
 }; // class Logger
 
diff --git a/Modules/Core/Common/src/otbLogger.cxx b/Modules/Core/Common/src/otbLogger.cxx
index 37a2ef05404e5ae0622beae3e1686c3189679ae4..b3730cf445a5816ca693da32de7d2a71f3aaba37 100644
--- a/Modules/Core/Common/src/otbLogger.cxx
+++ b/Modules/Core/Common/src/otbLogger.cxx
@@ -29,25 +29,28 @@
 namespace otb
 {
 
-Logger::Pointer Logger::Singleton = ITK_NULLPTR;
-
-Logger::Pointer Logger::Instance()
+Logger::Pointer Logger::CreateInstance()
 {
-  if(!Logger::Singleton)
-    {
-    Logger::Singleton = Logger::New();
+  Logger::Pointer instance = Logger::New();
 
-    // By default, redirect logs to std::cout
-    itk::StdStreamLogOutput::Pointer defaultOutput = itk::StdStreamLogOutput::New();
-    defaultOutput->SetStream(std::cout);
+  // By default, redirect logs to std::cout
+  itk::StdStreamLogOutput::Pointer defaultOutput = itk::StdStreamLogOutput::New();
+  defaultOutput->SetStream(std::cout);
+  
+  instance->AddLogOutput(defaultOutput);
+  
+  // Log setup information
+  instance->LogSetupInformation();
 
-    Logger::Singleton->AddLogOutput(defaultOutput);
+  return instance;
+}
 
-    // Log setup information
-    Logger::Singleton->LogSetupInformation();
-    }
-  
-  return Logger::Singleton;
+Logger::Pointer Logger::Instance()
+{
+  // Static locales are initialized once in a thread-safe way
+  static Logger::Pointer instance = CreateInstance();
+
+  return instance;
 }
 
 Logger::Logger()