diff --git a/include/opendht/dht_proxy_server.h b/include/opendht/dht_proxy_server.h
index 1614fca704f2dbddfa626908f0796eca7b16986e..c462a34c7ad49f9c4876b7343918e3dd7c060408 100644
--- a/include/opendht/dht_proxy_server.h
+++ b/include/opendht/dht_proxy_server.h
@@ -41,38 +41,43 @@
 class opendht_logger_t
 {
     public:
-        opendht_logger_t(const dht::Logger &logger):
-            m_logger(logger)
-        {}
+        opendht_logger_t(std::shared_ptr<dht::Logger> logger = nullptr){
+            if (logger)
+                m_logger = logger;
+        }
 
         template <typename Builder>
         void trace(Builder && msg_builder){
-            m_logger.d("[restinio] %s", msg_builder().c_str());
+            if (m_logger)
+                m_logger->d("[restinio] %s", msg_builder().c_str());
         }
 
         template <typename Builder>
         void info(Builder && msg_builder){
-            m_logger.d("[restinio] %s", msg_builder().c_str());
+            if (m_logger)
+                m_logger->d("[restinio] %s", msg_builder().c_str());
         }
 
         template <typename Builder>
         void warn(Builder && msg_builder){
-            m_logger.w("[restinio] %s", msg_builder().c_str());
+            if (m_logger)
+                m_logger->w("[restinio] %s", msg_builder().c_str());
         }
 
         template <typename Builder>
         void error(Builder && msg_builder){
-            m_logger.e("[restinio] %s", msg_builder().c_str());
+            if (m_logger)
+                m_logger->e("[restinio] %s", msg_builder().c_str());
         }
 
     private:
-        dht::Logger m_logger;
+        std::shared_ptr<dht::Logger> m_logger;
 };
 
 using RestRouter = restinio::router::express_router_t<>;
 using RestRouterTraits = restinio::traits_t<
     restinio::asio_timer_manager_t,
-    opendht_logger_t, //restinio::single_threaded_ostream_logger_t,
+    opendht_logger_t,
     RestRouter>;
 using RequestStatus = restinio::request_handling_status_t;
 using ResponseByParts = restinio::chunked_output_t;
@@ -101,7 +106,7 @@ public:
      * @note if the server fails to start (if port is already used or reserved),
      * it will fails silently
      */
-    DhtProxyServer(std::shared_ptr<DhtRunner> dht, in_port_t port = 8000, const std::string& pushServer = "", const Logger& logger = {});
+    DhtProxyServer(std::shared_ptr<DhtRunner> dht, in_port_t port = 8000, const std::string& pushServer = "", std::shared_ptr<dht::Logger> logger = nullptr);
     virtual ~DhtProxyServer();
 
     DhtProxyServer(const DhtProxyServer& other) = delete;
diff --git a/include/opendht/dhtrunner.h b/include/opendht/dhtrunner.h
index 847952630dec780bd1b150b5adf78066904a03af..04eeb750d009879133a34a86883bcdeba061cbc6 100644
--- a/include/opendht/dhtrunner.h
+++ b/include/opendht/dhtrunner.h
@@ -64,7 +64,7 @@ public:
     };
 
     struct Context {
-        std::unique_ptr<Logger> logger {};
+        std::shared_ptr<Logger> logger {};
         std::shared_ptr<PeerDiscovery> peerDiscovery {};
         Context() {}
     };
diff --git a/src/dht_proxy_server.cpp b/src/dht_proxy_server.cpp
index d04675e254a860870b3ce34966008ebab0165130..7696584ac0f1adb685ec15b6e24b236a8fcc3b19 100644
--- a/src/dht_proxy_server.cpp
+++ b/src/dht_proxy_server.cpp
@@ -51,7 +51,7 @@ constexpr const std::chrono::minutes PRINT_STATS_PERIOD {2};
 constexpr const size_t IO_THREADS_MAX {64};
 
 
-DhtProxyServer::DhtProxyServer(std::shared_ptr<DhtRunner> dht, in_port_t port , const std::string& pushServer, const Logger &logger)
+DhtProxyServer::DhtProxyServer(std::shared_ptr<DhtRunner> dht, in_port_t port , const std::string& pushServer, std::shared_ptr<dht::Logger> logger)
 :  dht_(dht), threadPool_(new ThreadPool(IO_THREADS_MAX)), pushServer_(pushServer)
 {
     if (not dht_)
@@ -69,7 +69,7 @@ DhtProxyServer::DhtProxyServer(std::shared_ptr<DhtRunner> dht, in_port_t port ,
     jsonBuilder_["commentStyle"] = "None";
     jsonBuilder_["indentation"] = "";
 
-    server_thread = std::thread([this, port, &logger](){
+    server_thread = std::thread([this, port, logger](){
         using namespace std::chrono;
         auto maxThreads = std::thread::hardware_concurrency() - 1;
         auto restThreads = maxThreads > 1 ? maxThreads : 1;
diff --git a/tools/dhtnode.cpp b/tools/dhtnode.cpp
index e70473a1d57f0a95669c9d5654f5163019fa06bc..68d87057461cedde3e84c9b43591d2e821ed67b1 100644
--- a/tools/dhtnode.cpp
+++ b/tools/dhtnode.cpp
@@ -537,6 +537,8 @@ main(int argc, char **argv)
                 context.logger = log::getFileLogger(params.logfile);
             else
                 context.logger = log::getStdLogger();
+        } else {
+            context.logger = nullptr;
         }
 
         node->run(params.port, config, std::move(context));
@@ -551,7 +553,7 @@ main(int argc, char **argv)
 #endif
         if (params.proxyserver != 0) {
 #ifdef OPENDHT_PROXY_SERVER
-            proxies.emplace(params.proxyserver, std::unique_ptr<DhtProxyServer>(new DhtProxyServer(node, params.proxyserver, params.pushserver, *context.logger)));
+            proxies.emplace(params.proxyserver, std::unique_ptr<DhtProxyServer>(new DhtProxyServer(node, params.proxyserver, params.pushserver, context.logger)));
 #else
             std::cerr << "DHT proxy server requested but OpenDHT built without proxy server support." << std::endl;
             exit(EXIT_FAILURE);