diff --git a/src/clients/iterative-query-controller.cpp b/src/clients/iterative-query-controller.cpp
index 442f9dc..6500c79 100644
--- a/src/clients/iterative-query-controller.cpp
+++ b/src/clients/iterative-query-controller.cpp
@@ -23,7 +23,8 @@
 
 namespace ndn {
 namespace ndns {
-NDNS_LOG_INIT("IterQueryCtr")
+
+NDNS_LOG_INIT(IterQueryCtr);
 
 IterativeQueryController::IterativeQueryController(const Name& dstLabel,
                                                    const name::Component& rrType,
diff --git a/src/clients/query-controller.hpp b/src/clients/query-controller.hpp
index 7729ea2..8a84645 100644
--- a/src/clients/query-controller.hpp
+++ b/src/clients/query-controller.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014, Regents of the University of California.
+/*
+ * Copyright (c) 2014-2018, Regents of the University of California.
  *
  * This file is part of NDNS (Named Data Networking Domain Name Service).
  * See AUTHORS.md for complete list of NDNS authors and contributors.
@@ -56,6 +56,9 @@
                   const QuerySucceedCallback& onSucceed, const QueryFailCallback& onFail,
                   Face& face);
 
+  virtual
+  ~QueryController() = default;
+
   /**
    * @brief start query process.
    */
diff --git a/src/common.hpp b/src/common.hpp
index 50b278a..92f9dec 100644
--- a/src/common.hpp
+++ b/src/common.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2017, Regents of the University of California.
+ * Copyright (c) 2014-2018, Regents of the University of California.
  *
  * This file is part of NDNS (Named Data Networking Domain Name Service).
  * See AUTHORS.md for complete list of NDNS authors and contributors.
@@ -20,6 +20,8 @@
 #ifndef NDNS_COMMON_HPP
 #define NDNS_COMMON_HPP
 
+#include "config.hpp"
+
 #ifdef NDNS_HAVE_TESTS
 #define NDNS_VIRTUAL_WITH_TESTS virtual
 #define NDNS_PUBLIC_WITH_TESTS_ELSE_PROTECTED public
@@ -32,4 +34,11 @@
 #define NDNS_PROTECTED_WITH_TESTS_ELSE_PRIVATE private
 #endif
 
+#include <ndn-cxx/name.hpp>
+
+#include <functional>
+#include <map>
+#include <boost/noncopyable.hpp>
+#include <boost/property_tree/ptree.hpp>
+
 #endif // NDNS_COMMON_HPP
diff --git a/src/daemon/config-file.cpp b/src/daemon/config-file.cpp
index 525287d..a03937f 100644
--- a/src/daemon/config-file.cpp
+++ b/src/daemon/config-file.cpp
@@ -1,6 +1,12 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014, Regents of the University of California.
+/*
+ * Copyright (c) 2014-2018,  Regents of the University of California,
+ *                           Arizona Board of Regents,
+ *                           Colorado State University,
+ *                           University Pierre & Marie Curie, Sorbonne University,
+ *                           Washington University in St. Louis,
+ *                           Beijing Institute of Technology,
+ *                           The University of Memphis.
  *
  * This file is part of NDNS (Named Data Networking Domain Name Service).
  * See AUTHORS.md for complete list of NDNS authors and contributors.
@@ -17,40 +23,19 @@
  * NDNS, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-/**
- * Copyright (c) 2014  Regents of the University of California,
- *                     Arizona Board of Regents,
- *                     Colorado State University,
- *                     University Pierre & Marie Curie, Sorbonne University,
- *                     Washington University in St. Louis,
- *                     Beijing Institute of Technology
- *
- * This file is part of NFD (Named Data Networking Forwarding Daemon).
- * See AUTHORS.md for complete list of NFD authors and contributors.
- *
- * NFD is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
 #include "config-file.hpp"
 #include "logger.hpp"
 
 #include <boost/property_tree/info_parser.hpp>
 #include <fstream>
 
-
 namespace ndn {
 namespace ndns {
 
-NDNS_LOG_INIT("ConfigFile")
+ConfigFile::ConfigFile(UnknownConfigSectionHandler unknownSectionCallback)
+  : m_unknownSectionCallback(unknownSectionCallback)
+{
+}
 
 void
 ConfigFile::throwErrorOnUnknownSection(const std::string& filename,
@@ -58,11 +43,8 @@
                                        const ConfigSection& section,
                                        bool isDryRun)
 {
-  std::string msg = "Error processing configuration file ";
-  msg += filename;
-  msg += ": no module subscribed for section \"" + sectionName + "\"";
-
-  throw ConfigFile::Error(msg);
+  BOOST_THROW_EXCEPTION(Error("Error processing configuration file " + filename +
+                              ": no module subscribed for section \"" + sectionName + "\""));
 }
 
 void
@@ -74,9 +56,21 @@
   // do nothing
 }
 
-ConfigFile::ConfigFile(UnknownConfigSectionHandler unknownSectionCallback)
-  : m_unknownSectionCallback(unknownSectionCallback)
+bool
+ConfigFile::parseYesNo(const ConfigSection& node, const std::string& key,
+                       const std::string& sectionName)
 {
+  auto value = node.get_value<std::string>();
+
+  if (value == "yes") {
+    return true;
+  }
+  else if (value == "no") {
+    return false;
+  }
+
+  BOOST_THROW_EXCEPTION(Error("Invalid value \"" + value + "\" for option \"" +
+                              key + "\" in \"" + sectionName + "\" section"));
 }
 
 void
@@ -89,15 +83,10 @@
 void
 ConfigFile::parse(const std::string& filename, bool isDryRun)
 {
-  BOOST_ASSERT(isDryRun == false);
-  std::ifstream inputFile;
-  inputFile.open(filename.c_str());
-  if (!inputFile.good() || !inputFile.is_open())
-    {
-      std::string msg = "Failed to read configuration file: ";
-      msg += filename;
-      throw Error(msg);
-    }
+  std::ifstream inputFile(filename);
+  if (!inputFile.good() || !inputFile.is_open()) {
+    BOOST_THROW_EXCEPTION(Error("Failed to read configuration file " + filename));
+  }
   parse(inputFile, isDryRun, filename);
   inputFile.close();
 }
@@ -109,57 +98,41 @@
   parse(inputStream, isDryRun, filename);
 }
 
-
 void
 ConfigFile::parse(std::istream& input, bool isDryRun, const std::string& filename)
 {
-  try
-    {
-      boost::property_tree::read_info(input, m_global);
-    }
-  catch (const boost::property_tree::info_parser_error& error)
-    {
-      std::stringstream msg;
-      msg << "Failed to parse configuration file";
-      msg << " " << filename;
-      msg << " " << error.message() << " line " << error.line();
-      throw Error(msg.str());
-    }
+  try {
+    boost::property_tree::read_info(input, m_global);
+  }
+  catch (const boost::property_tree::info_parser_error& error) {
+    BOOST_THROW_EXCEPTION(Error("Failed to parse configuration file " + filename +
+                                ": " + error.message() + " on line " + to_string(error.line())));
+  }
 
   process(isDryRun, filename);
 }
 
 void
-ConfigFile::process(bool isDryRun, const std::string& filename)
+ConfigFile::parse(const ConfigSection& config, bool isDryRun, const std::string& filename)
 {
-  BOOST_ASSERT(isDryRun == false);
+  m_global = config;
+  process(isDryRun, filename);
+}
+
+void
+ConfigFile::process(bool isDryRun, const std::string& filename) const
+{
   BOOST_ASSERT(!filename.empty());
-  // NFD_LOG_DEBUG("processing..." << ((isDryRun)?("dry run"):("")));
 
-  if (m_global.begin() == m_global.end())
-    {
-      std::string msg = "Error processing configuration file: ";
-      msg += filename;
-      msg += " no data";
-      throw Error(msg);
+  for (const auto& i : m_global) {
+    try {
+      const ConfigSectionHandler& subscriber = m_subscriptions.at(i.first);
+      subscriber(i.second, isDryRun, filename);
     }
-
-  for (ConfigSection::const_iterator i = m_global.begin(); i != m_global.end(); ++i)
-    {
-      const std::string& sectionName = i->first;
-      const ConfigSection& section = i->second;
-
-      SubscriptionTable::iterator subscriberIt = m_subscriptions.find(sectionName);
-      if (subscriberIt != m_subscriptions.end())
-        {
-          ConfigSectionHandler subscriber = subscriberIt->second;
-          subscriber(section, isDryRun, filename);
-        }
-      else
-        {
-          m_unknownSectionCallback(filename, sectionName, section, isDryRun);
-        }
+    catch (const std::out_of_range&) {
+      m_unknownSectionCallback(filename, i.first, i.second, isDryRun);
     }
+  }
 }
 
 } // namespace ndns
diff --git a/src/daemon/config-file.hpp b/src/daemon/config-file.hpp
index fca4af2..a177bfa 100644
--- a/src/daemon/config-file.hpp
+++ b/src/daemon/config-file.hpp
@@ -1,6 +1,12 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014, Regents of the University of California.
+/*
+ * Copyright (c) 2014-2018,  Regents of the University of California,
+ *                           Arizona Board of Regents,
+ *                           Colorado State University,
+ *                           University Pierre & Marie Curie, Sorbonne University,
+ *                           Washington University in St. Louis,
+ *                           Beijing Institute of Technology,
+ *                           The University of Memphis.
  *
  * This file is part of NDNS (Named Data Networking Domain Name Service).
  * See AUTHORS.md for complete list of NDNS authors and contributors.
@@ -17,59 +23,40 @@
  * NDNS, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-/**
- * Copyright (c) 2014  Regents of the University of California,
- *                     Arizona Board of Regents,
- *                     Colorado State University,
- *                     University Pierre & Marie Curie, Sorbonne University,
- *                     Washington University in St. Louis,
- *                     Beijing Institute of Technology
- *
- * This file is part of NFD (Named Data Networking Forwarding Daemon).
- * See AUTHORS.md for complete list of NFD authors and contributors.
- *
- * NFD is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
 #ifndef NDNS_DAEMON_CONFIG_FILE_HPP
 #define NDNS_DAEMON_CONFIG_FILE_HPP
 
 #include "common.hpp"
-#include <functional>
-#include <map>
-#include <boost/noncopyable.hpp>
-#include <boost/property_tree/ptree.hpp>
-
 
 namespace ndn {
 namespace ndns {
 
+/** \brief a config file section
+ */
 typedef boost::property_tree::ptree ConfigSection;
 
-/// \brief callback for config file sections
-typedef std::function<void(const ConfigSection& /*section*/,
-                      bool /*isDryRun*/,
-                      const std::string& /*filename*/)> ConfigSectionHandler;
+/** \brief an optional config file section
+ */
+typedef boost::optional<const ConfigSection&> OptionalConfigSection;
 
-/// \brief callback for config file sections without a subscribed handler
-typedef std::function<void(const std::string& /*filename*/,
-                      const std::string& /*sectionName*/,
-                      const ConfigSection& /*section*/,
-                      bool /*isDryRun*/)> UnknownConfigSectionHandler;
+/** \brief callback to process a config file section
+ */
+typedef function<void(const ConfigSection& section,
+                      bool isDryRun,
+                      const std::string& filename)> ConfigSectionHandler;
 
-class ConfigFile : boost::noncopyable
+/** \brief callback to process a config file section without a \p ConfigSectionHandler
+ */
+typedef function<void(const std::string& filename,
+                      const std::string& sectionName,
+                      const ConfigSection& section,
+                      bool isDryRun)> UnknownConfigSectionHandler;
+
+/** \brief configuration file parsing utility
+ */
+class ConfigFile : noncopyable
 {
 public:
-
   class Error : public std::runtime_error
   {
   public:
@@ -77,12 +64,13 @@
     Error(const std::string& what)
       : std::runtime_error(what)
     {
-
     }
   };
 
+  explicit
   ConfigFile(UnknownConfigSectionHandler unknownSectionCallback = throwErrorOnUnknownSection);
 
+public: // unknown section handlers
   static void
   throwErrorOnUnknownSection(const std::string& filename,
                              const std::string& sectionName,
@@ -95,12 +83,55 @@
                        const ConfigSection& section,
                        bool isDryRun);
 
+public: // parse helpers
+  /** \brief parse a config option that can be either "yes" or "no"
+   *  \retval true "yes"
+   *  \retval false "no"
+   *  \throw Error the value is neither "yes" nor "no"
+   */
+  static bool
+  parseYesNo(const ConfigSection& node, const std::string& key, const std::string& sectionName);
+
+  static bool
+  parseYesNo(const ConfigSection::value_type& option, const std::string& sectionName)
+  {
+    return parseYesNo(option.second, option.first, sectionName);
+  }
+
+  /**
+   * \brief parse a numeric (integral or floating point) config option
+   * \tparam T an arithmetic type
+   *
+   * \return the numeric value of the parsed option
+   * \throw Error the value cannot be converted to the specified type
+   */
+  template<typename T>
+  static T
+  parseNumber(const ConfigSection& node, const std::string& key, const std::string& sectionName)
+  {
+    static_assert(std::is_arithmetic<T>::value, "T must be an arithmetic type");
+
+    boost::optional<T> value = node.get_value_optional<T>();
+    if (value) {
+      return *value;
+    }
+    BOOST_THROW_EXCEPTION(Error("Invalid value \"" + node.get_value<std::string>() +
+                                "\" for option \"" + key + "\" in \"" + sectionName + "\" section"));
+  }
+
+  template <typename T>
+  static T
+  parseNumber(const ConfigSection::value_type& option, const std::string& sectionName)
+  {
+    return parseNumber<T>(option.second, option.first, sectionName);
+  }
+
+public: // setup and parsing
   /// \brief setup notification of configuration file sections
   void
   addSectionHandler(const std::string& sectionName,
                     ConfigSectionHandler subscriber);
 
-
   /**
    * \param filename file to parse
    * \param isDryRun true if performing a dry run of configuration, false otherwise
@@ -113,7 +144,7 @@
   /**
    * \param input configuration (as a string) to parse
    * \param isDryRun true if performing a dry run of configuration, false otherwise
-   * \param filename optional convenience argument to provide more detailed error messages
+   * \param filename logical filename of the config file, can appear in error messages
    * \throws ConfigFile::Error if file not found
    * \throws ConfigFile::Error if parse error
    */
@@ -123,24 +154,28 @@
   /**
    * \param input stream to parse
    * \param isDryRun true if performing a dry run of configuration, false otherwise
-   * \param filename optional convenience argument to provide more detailed error messages
+   * \param filename logical filename of the config file, can appear in error messages
    * \throws ConfigFile::Error if parse error
    */
   void
   parse(std::istream& input, bool isDryRun, const std::string& filename);
 
-private:
-
+  /**
+   * \param config ConfigSection that needs to be processed
+   * \param isDryRun true if performing a dry run of configuration, false otherwise
+   * \param filename logical filename of the config file, can appear in error messages
+   * \throws ConfigFile::Error if parse error
+   */
   void
-  process(bool isDryRun, const std::string& filename);
+  parse(const ConfigSection& config, bool isDryRun, const std::string& filename);
+
+private:
+  void
+  process(bool isDryRun, const std::string& filename) const;
 
 private:
   UnknownConfigSectionHandler m_unknownSectionCallback;
-
-  typedef std::map<std::string, ConfigSectionHandler> SubscriptionTable;
-
-  SubscriptionTable m_subscriptions;
-
+  std::map<std::string, ConfigSectionHandler> m_subscriptions;
   ConfigSection m_global;
 };
 
diff --git a/src/daemon/db-mgr.cpp b/src/daemon/db-mgr.cpp
index 5652de2..52c636f 100644
--- a/src/daemon/db-mgr.cpp
+++ b/src/daemon/db-mgr.cpp
@@ -27,7 +27,7 @@
 namespace ndn {
 namespace ndns {
 
-NDNS_LOG_INIT("DbMgr")
+NDNS_LOG_INIT(DbMgr);
 
 static const std::string NDNS_SCHEMA = R"VALUE(
 CREATE TABLE IF NOT EXISTS zones (
diff --git a/src/daemon/name-server.cpp b/src/daemon/name-server.cpp
index c7649ef..cc1c881 100644
--- a/src/daemon/name-server.cpp
+++ b/src/daemon/name-server.cpp
@@ -24,7 +24,8 @@
 
 namespace ndn {
 namespace ndns {
-NDNS_LOG_INIT("NameServer")
+
+NDNS_LOG_INIT(NameServer);
 
 const time::milliseconds NAME_SERVER_DEFAULT_CONTENT_FRESHNESS(4000);
 
@@ -134,7 +135,7 @@
                          bind(&NameServer::doUpdate, this, interest.shared_from_this(), data),
                          [this] (const Data& data, const security::v2::ValidationError& msg) {
                            NDNS_LOG_WARN("Ignoring update that did not pass the verification. "
-                                         << "Check the root certificate")
+                                         << "Check the root certificate");
                          });
   }
 }
diff --git a/src/daemon/rrset-factory.cpp b/src/daemon/rrset-factory.cpp
index 3bfca03..d4a0d87 100644
--- a/src/daemon/rrset-factory.cpp
+++ b/src/daemon/rrset-factory.cpp
@@ -28,8 +28,6 @@
 namespace ndn {
 namespace ndns {
 
-NDNS_LOG_INIT("RrsetFactory")
-
 RrsetFactory::RrsetFactory(const boost::filesystem::path& dbFile,
                            const Name& zoneName,
                            KeyChain& keyChain,
diff --git a/src/logger.cpp b/src/logger.cpp
deleted file mode 100644
index 6d89450..0000000
--- a/src/logger.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014, Regents of the University of California.
- *
- * This file is part of NDNS (Named Data Networking Domain Name Service).
- * See AUTHORS.md for complete list of NDNS authors and contributors.
- *
- * NDNS is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * NDNS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * NDNS, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "logger.hpp"
-
-#include <log4cxx/logger.h>
-#include <log4cxx/basicconfigurator.h>
-#include <log4cxx/consoleappender.h>
-#include <log4cxx/patternlayout.h>
-#include <log4cxx/level.h>
-#include <log4cxx/propertyconfigurator.h>
-#include <log4cxx/defaultconfigurator.h>
-#include <log4cxx/helpers/exception.h>
-
-#include <unistd.h>
-
-namespace ndn {
-namespace ndns {
-namespace log {
-
-void
-init(const std::string& configFile/*= DEFAULT_CONFIG_PATH "/" "log4cxx.properties"*/)
-{
-  using namespace log4cxx;
-  using namespace log4cxx::helpers;
-
-  if (access(configFile.c_str(), R_OK) == 0) {
-    PropertyConfigurator::configureAndWatch(configFile.c_str());
-  }
-  else {
-    PatternLayoutPtr   layout(new PatternLayout("%d{HH:mm:ss} %p %c{1} - %m%n"));
-    ConsoleAppenderPtr appender(new ConsoleAppender(layout, ConsoleAppender::getSystemErr()));
-    BasicConfigurator::configure(appender);
-    Logger::getRootLogger()->setLevel(log4cxx::Level::getInfo());
-  }
-}
-
-} // namespace log
-} // namespace ndns
-} // namespace ndn
diff --git a/src/logger.hpp b/src/logger.hpp
index a8999f2..1ed72e0 100644
--- a/src/logger.hpp
+++ b/src/logger.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014, Regents of the University of California.
+/*
+ * Copyright (c) 2014-2018, Regents of the University of California.
  *
  * This file is part of NDNS (Named Data Networking Domain Name Service).
  * See AUTHORS.md for complete list of NDNS authors and contributors.
@@ -20,49 +20,18 @@
 #ifndef NDNS_LOGGER_HPP
 #define NDNS_LOGGER_HPP
 
-#include "config.hpp"
-#include <log4cxx/logger.h>
+#include <ndn-cxx/util/logger.hpp>
 
-namespace ndn {
-namespace ndns {
-namespace log {
+#define NDNS_LOG_INIT(name) NDN_LOG_INIT(ndns.name)
 
-void
-init(const std::string& configFile = DEFAULT_CONFIG_PATH "/" "log4cxx.properties");
+#define NDNS_LOG_FATAL(x) NDN_LOG_FATAL(x)
+#define NDNS_LOG_ERROR(x) NDN_LOG_ERROR(x)
+#define NDNS_LOG_WARN(x)  NDN_LOG_WARN(x)
+#define NDNS_LOG_INFO(x)  NDN_LOG_INFO(x)
+#define NDNS_LOG_DEBUG(x) NDN_LOG_DEBUG(x)
+#define NDNS_LOG_TRACE(x) NDN_LOG_TRACE(x)
 
-// The following has to be pre-processor defines in order to properly determine
-// log locations
-
-#define NDNS_LOG_INIT(name)                                             \
-  static log4cxx::LoggerPtr staticModuleLogger = log4cxx::Logger::getLogger(name);
-
-#define NDNS_LOG_TRACE(x)                       \
-  LOG4CXX_TRACE(staticModuleLogger, x);
-
-#define NDNS_LOG_DEBUG(x)                       \
-  LOG4CXX_DEBUG(staticModuleLogger, x);
-
-#define NDNS_LOG_INFO(x)                        \
-  LOG4CXX_INFO(staticModuleLogger, x);
-
-#define NDNS_LOG_WARN(x)                        \
-  LOG4CXX_WARN(staticModuleLogger, x);
-
-#define NDNS_LOG_ERROR(x)                       \
-  LOG4CXX_ERROR(staticModuleLogger, x);
-
-#define NDNS_LOG_FATAL(x)                       \
-  LOG4CXX_FATAL(staticModuleLogger, x);
-
-#define NDNS_LOG_FUNCTION(x)                                            \
-  LOG4CXX_TRACE(staticModuleLogger, __FUNCTION__ << "(" << x << ")");
-
-#define NDNS_LOG_FUNCTION_NOARGS                                \
-  LOG4CXX_TRACE(staticModuleLogger, __FUNCTION__ << "()");
-
-
-} // namespace log
-} // namespace ndns
-} // namespace ndn
+#define NDNS_LOG_FUNCTION(x)     NDN_LOG_TRACE(__FUNCTION__ << "(" << x << ")")
+#define NDNS_LOG_FUNCTION_NOARGS NDN_LOG_TRACE(__FUNCTION__ << "()")
 
 #endif // NDNS_LOGGER_HPP
diff --git a/src/mgmt/management-tool.cpp b/src/mgmt/management-tool.cpp
index 5407427..3832561 100644
--- a/src/mgmt/management-tool.cpp
+++ b/src/mgmt/management-tool.cpp
@@ -42,7 +42,7 @@
 namespace ndn {
 namespace ndns {
 
-NDNS_LOG_INIT("ManagementTool")
+NDNS_LOG_INIT(ManagementTool);
 
 using security::transform::base64Encode;
 using security::transform::streamSink;
diff --git a/src/validator/certificate-fetcher-ndns-cert.cpp b/src/validator/certificate-fetcher-ndns-cert.cpp
index 8131bea..4e0f01c 100644
--- a/src/validator/certificate-fetcher-ndns-cert.cpp
+++ b/src/validator/certificate-fetcher-ndns-cert.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2017, Regents of the University of California.
+/*
+ * Copyright (c) 2014-2018, Regents of the University of California.
  *
  * This file is part of NDNS (Named Data Networking Domain Name Service).
  * See AUTHORS.md for complete list of NDNS authors and contributors.
@@ -30,7 +30,7 @@
 
 using security::v2::Certificate;
 
-NDNS_LOG_INIT("CertificateFetcherNdnsCert")
+NDNS_LOG_INIT(CertificateFetcherNdnsCert);
 
 CertificateFetcherNdnsCert::CertificateFetcherNdnsCert(Face& face,
                                                        size_t nsCacheSize,
@@ -57,18 +57,18 @@
     return ;
   }
 
-  auto query = make_shared<IterativeQueryController>(domain,
-                                                     label::NS_RR_TYPE,
-                                                     certRequest->m_interest.getInterestLifetime(),
-                                                     [=] (const Data& data, const Response& response) {
-                                                       nsSuccessCallback(data, certRequest, state, continueValidation);
-                                                     },
-                                                     [=] (uint32_t errCode, const std::string& errMsg) {
-                                                       nsFailCallback(errMsg, certRequest, state, continueValidation);
-                                                     },
-                                                     m_face,
-                                                     nullptr,
-                                                     m_nsCache.get());
+  auto query = std::make_shared<IterativeQueryController>(domain,
+                                                          label::NS_RR_TYPE,
+                                                          certRequest->m_interest.getInterestLifetime(),
+                                                          [=] (const Data& data, const Response& response) {
+                                                            nsSuccessCallback(data, certRequest, state, continueValidation);
+                                                          },
+                                                          [=] (uint32_t errCode, const std::string& errMsg) {
+                                                            nsFailCallback(errMsg, certRequest, state, continueValidation);
+                                                          },
+                                                          m_face,
+                                                          nullptr,
+                                                          m_nsCache.get());
   query->setStartComponentIndex(m_startComponentIndex);
   query->start();
   auto queryTag = make_shared<IterativeQueryTag>(query);
diff --git a/src/validator/validator.cpp b/src/validator/validator.cpp
index 3497d20..6c6e53a 100644
--- a/src/validator/validator.cpp
+++ b/src/validator/validator.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2017, Regents of the University of California.
+ * Copyright (c) 2014-2018, Regents of the University of California.
  *
  * This file is part of NDNS (Named Data Networking Domain Name Service).
  * See AUTHORS.md for complete list of NDNS authors and contributors.
@@ -27,7 +27,7 @@
 namespace ndn {
 namespace ndns {
 
-NDNS_LOG_INIT("validator")
+NDNS_LOG_INIT(Validator);
 
 std::string NdnsValidatorBuilder::VALIDATOR_CONF_FILE = DEFAULT_CONFIG_PATH "/" "validator.conf";
 
