diff --git a/Log.cpp b/Log.cpp
index 590f3d0f..5660821f 100644
--- a/Log.cpp
+++ b/Log.cpp
@@ -10,7 +10,7 @@
 
 namespace i2p {
 namespace log {
-	Log logger;
+	static Log logger;
 	/**
 	 * @brief Maps our loglevel to their symbolic name
 	 */
diff --git a/Log.h b/Log.h
index bedc98f8..79bbeb3f 100644
--- a/Log.h
+++ b/Log.h
@@ -162,17 +162,17 @@ namespace log {
 
 /** internal usage only -- folding args array to single string */
 template<typename TValue>
-void LogPrint (std::stringstream& s, TValue arg)
+void LogPrint (std::stringstream& s, TValue&& arg) noexcept
 {
-	s << arg;
+	s << std::forward<TValue>(arg);
 }
 
 /** internal usage only -- folding args array to single string */
 template<typename TValue, typename... TArgs>
-void LogPrint (std::stringstream& s, TValue arg, TArgs... args)
+void LogPrint (std::stringstream& s, TValue&& arg, TArgs&&... args) noexcept
 {
-	LogPrint (s, arg);
-	LogPrint (s, args...);
+	LogPrint (s, std::forward<TValue>(arg));
+	LogPrint (s, std::forward<TArgs>(args)...);
 }
 
 /**
@@ -181,7 +181,7 @@ void LogPrint (std::stringstream& s, TValue arg, TArgs... args)
  * @param args Array of message parts
  */
 template<typename... TArgs>
-void LogPrint (LogLevel level, TArgs... args)
+void LogPrint (LogLevel level, TArgs&&... args) noexcept
 {
 	i2p::log::Log &log = i2p::log::Logger();
 	if (level > log.GetLogLevel ())
@@ -194,7 +194,7 @@ void LogPrint (LogLevel level, TArgs... args)
 		ss << LOG_COLOR_ERROR;
 	else if (level == eLogWarning) // if log level is WARN color log message yellow
 		ss << LOG_COLOR_WARNING;
-	LogPrint (ss, args ...);
+	LogPrint (ss, std::forward<TArgs>(args)...);
   
 	// reset color
 	ss << LOG_COLOR_RESET;