diff --git a/catalog/src/main.cpp b/catalog/src/main.cpp
index 4c85d8c..7655315 100644
--- a/catalog/src/main.cpp
+++ b/catalog/src/main.cpp
@@ -25,12 +25,15 @@
 #include <getopt.h>
 #include <ndn-cxx/face.hpp>
 
+#ifdef HAVE_LOG4CXX
+  INIT_LOGGER("atmos-catalog::Main");
+#endif
 
 void
 usage()
 {
   std::cout << "\n Usage:\n atmos-catalog "
-    "[-h] [-f config file] "
+    "[-h] [-f config file] \n"
     "   [-f config file]    - set the configuration file\n"
     "   [-h]                - print help and exit\n"
     "\n";
@@ -42,6 +45,10 @@
   int option;
   std::string configFile(DEFAULT_CONFIG_FILE);
 
+#ifdef HAVE_LOG4CXX
+  log4cxx::PropertyConfigurator::configure(LOG4CXX_CONFIG_FILE);
+#endif
+
   while ((option = getopt(argc, argv, "f:h")) != -1) {
     switch (option) {
       case 'f':
@@ -73,8 +80,23 @@
   catalogInstance.addAdapter(queryAdapter);
   catalogInstance.addAdapter(publishAdapter);
 
-  catalogInstance.initialize();
-  face->processEvents();
+  try {
+    catalogInstance.initialize();
+  }
+  catch (std::exception& e) {
+    std::cout << e.what() << std::endl;
+  }
+
+#ifndef NDEBUG
+  try {
+#endif
+    face->processEvents();
+#ifndef NDEBUG
+  }
+  catch (std::exception& e) {
+    _LOG_DEBUG(e.what());
+  }
+#endif
 
   return 0;
 }
diff --git a/catalog/src/publish/publish-adapter.hpp b/catalog/src/publish/publish-adapter.hpp
index c331bf7..5dd9206 100644
--- a/catalog/src/publish/publish-adapter.hpp
+++ b/catalog/src/publish/publish-adapter.hpp
@@ -42,8 +42,13 @@
 #include <unordered_map>
 #include <mutex>
 
+#include "util/logger.hpp"
+
 namespace atmos {
 namespace publish {
+#ifdef HAVE_LOG4CXX
+  INIT_LOGGER("PublishAdapter");
+#endif
 
 #define RETRY_WHEN_TIMEOUT 2
 // TODO: need to use the configured nameFields
@@ -409,8 +414,7 @@
   m_signingId = ndn::Name(signingId);
   setCatalogId();
 
-  m_syncPrefix.clear();
-  m_syncPrefix.append(syncPrefix);
+  m_syncPrefix = syncPrefix;
   util::ConnectionDetails mysqlId(dbServer, dbUser, dbPasswd, dbName);
 
   initializeDatabase(mysqlId);
@@ -448,7 +452,7 @@
     MySQLPerformQuery(m_databaseHandler, createSyncTable, util::CREATE,
                       success, errMsg);
     if (!success)
-      std::cout << errMsg << std::endl;
+      _LOG_DEBUG(errMsg);
 
     // create SQL string for table creation, id, sha256, and name are columns that we need
     std::stringstream ss;
@@ -465,7 +469,7 @@
     success = false;
     MySQLPerformQuery(m_databaseHandler, ss.str(), util::CREATE, success, errMsg);
     if (!success)
-      std::cout << errMsg << std::endl;
+      _LOG_DEBUG(errMsg);
   }
   else {
     throw Error("cannot connect to the Database");
@@ -477,17 +481,20 @@
 PublishAdapter<DatabaseHandler>::onPublishInterest(const ndn::InterestFilter& filter,
                                                    const ndn::Interest& interest)
 {
+  _LOG_DEBUG(">> PublishAdapter::onPublishInterest");
+
   // Example Interest : /cmip5/publish/<uri>/<nonce>
-  std::cout << "Publish interest : " << interest.getName().toUri() << std::endl;
+  _LOG_DEBUG(interest.getName().toUri());
 
   //send back ACK
-  char buf[4] = "ACK";
+  char buf[] = "ACK";
   std::shared_ptr<ndn::Data> data = std::make_shared<ndn::Data>(interest.getName());
   data->setFreshnessPeriod(ndn::time::milliseconds(10)); // 10 msec
   data->setContent(reinterpret_cast<const uint8_t*>(buf), strlen(buf));
   m_keyChain->sign(*data);
   m_face->put(*data);
-  std::cout << "Sent ACK for " << interest.getName() << std::endl;
+
+  _LOG_DEBUG("ACK interest : " << interest.getName().toUri());
 
 
   //TODO: if already in catalog, what do we do?
@@ -501,15 +508,17 @@
   m_face->expressInterest(*retrieveInterest,
                           bind(&PublishAdapter<DatabaseHandler>::onPublishedData,
                                this,_1, _2),
-                          bind(&PublishAdapter<DatabaseHandler>::onTimeout, this, _1));
-  std::cout << "Expressing Interest for: " << retrieveInterest->toUri() << std::endl;
+                          bind(&publish::PublishAdapter<DatabaseHandler>::onTimeout, this, _1));
+
+  _LOG_DEBUG("Expressing Interest " << retrieveInterest->toUri());
+  _LOG_DEBUG("<< PublishAdapter::onPublishInterest");
 }
 
 template <typename DatabaseHandler>
 void
 PublishAdapter<DatabaseHandler>::onTimeout(const ndn::Interest& interest)
 {
-  std::cout << "interest " << interest.getName() << " timed out";
+  _LOG_DEBUG(interest.getName() << "timed out");
 }
 
 template <typename DatabaseHandler>
@@ -517,7 +526,7 @@
 PublishAdapter<DatabaseHandler>::onValidationFailed(const std::shared_ptr<const ndn::Data>& data,
                                                     const std::string& failureInfo)
 {
-  std::cout << "Validation failed: " << data->getName() << failureInfo << std::endl;
+  _LOG_DEBUG(data->getName() << " validation failed: " << failureInfo);
 }
 
 template <typename DatabaseHandler>
@@ -525,7 +534,8 @@
 PublishAdapter<DatabaseHandler>::onPublishedData(const ndn::Interest& interest,
                                                  const ndn::Data& data)
 {
-  std::cout << "received Data " << data.getName() << std::endl;
+  _LOG_DEBUG(">> PublishAdapter::onPublishedData");
+  _LOG_DEBUG("Data name: " << data.getName());
   if (data.getContent().empty()) {
     return;
   }
@@ -538,13 +548,15 @@
 void
 PublishAdapter<DatabaseHandler>::validatePublishedDataPaylod(const ndn::shared_ptr<const ndn::Data>& data)
 {
+  _LOG_DEBUG(">> PublishAdapter::onValidatePublishedDataPayload");
+
   // validate published data payload, if failed, return
   if (!validatePublicationChanges(data)) {
-    std::cout << "data validation failed : " << data->getName() << std::endl;
+    _LOG_DEBUG("Data validation failed : " << data->getName());
 #ifndef NDEBUG
     const std::string payload(reinterpret_cast<const char*>(data->getContent().value()),
                               data->getContent().value_size());
-    std::cout << payload << std::endl;
+    _LOG_DEBUG(payload);
 #endif
     return;
   }
@@ -565,8 +577,9 @@
     ndn::Name nextInterestName = data->getName().getPrefix(-1);
     uint64_t incomingSegment = data->getName()[-1].toSegment();
     incomingSegment++;
-    std::cout << " Next Interest Name " << nextInterestName << " Segment " << incomingSegment
-              << std::endl;
+
+    _LOG_DEBUG("Next Interest Name " << nextInterestName << " Segment " << incomingSegment);
+
     std::shared_ptr<ndn::Interest> nextInterest =
       std::make_shared<ndn::Interest>(nextInterestName.appendSegment(incomingSegment));
     nextInterest->setInterestLifetime(ndn::time::milliseconds(4000));
@@ -583,6 +596,8 @@
 void
 PublishAdapter<DatabaseHandler>::processUpdateData(const ndn::shared_ptr<const ndn::Data>& data)
 {
+  _LOG_DEBUG(">> PublishAdapter::processUpdateData");
+
   const std::string payload(reinterpret_cast<const char*>(data->getContent().value()),
                             data->getContent().value_size());
 
@@ -596,16 +611,12 @@
   Json::Reader jsonReader;
   if (!jsonReader.parse(payload, parsedFromPayload)) {
     // todo: logging events
-    std::cout << "fail to parse the update data" << std::endl;
+    _LOG_DEBUG("Fail to parse the update data");
     return;
   }
-  else {
-    std::cout << "received Json format payload : "
-              << parsedFromPayload.toStyledString() << std::endl;
-  }
+
   std::stringstream ss;
   if (json2Sql(ss, parsedFromPayload, util::ADD)) {
-    std::cout << "sql string to insert data : " << ss.str() << std::endl;
     // todo: before use, check if the connection is not NULL
     // we may need to use lock here to ensure thread safe
     operateDatabase(ss.str(), util::ADD);
@@ -614,7 +625,6 @@
   ss.str("");
   ss.clear();
   if (json2Sql(ss, parsedFromPayload, util::REMOVE)) {
-    std::cout << "sql string to remove data: " << ss.str() << std::endl;
     operateDatabase(ss.str(), util::REMOVE);
   }
 }
@@ -631,17 +641,17 @@
 chronosync::SeqNo
 PublishAdapter<MYSQL>::getLatestSeqNo(const chronosync::MissingDataInfo& update)
 {
+  _LOG_DEBUG(">> PublishAdapter::getLatestSeqNo");
+
   std::string sql = "SELECT seq_num FROM chronosync_update_info WHERE session_name = '"
     + update.session.toUri() + "';";
-#ifndef NDEBUG
-  std::cout << "get latest seqNo : " << sql << std::endl;
-#endif
+
   std::string errMsg;
   bool success;
   std::shared_ptr<MYSQL_RES> results
     = atmos::util::MySQLPerformQuery(m_databaseHandler, sql, util::QUERY, success, errMsg);
   if (!success) {
-    std::cout << errMsg << std::endl;
+    _LOG_DEBUG(errMsg);
     return 0; //database connection error?
   }
   else if (results != nullptr){
@@ -672,14 +682,14 @@
   std::string sql = "UPDATE chronosync_update_info SET seq_num = "
     + boost::lexical_cast<std::string>(update.high)
     + " WHERE session_name = '" + update.session.toUri() + "';";
-  std::cout << "renew update Info : " << sql << std::endl;
+
   std::string errMsg;
   bool success = false;
   m_mutex.lock();
   util::MySQLPerformQuery(m_databaseHandler, sql, util::UPDATE, success, errMsg);
   m_mutex.unlock();
   if (!success)
-    std::cout << errMsg << std::endl;
+    _LOG_DEBUG(errMsg);
 }
 
 template <typename DatabaseHandler>
@@ -697,14 +707,13 @@
     + update.session.toUri() + "', " + boost::lexical_cast<std::string>(update.high)
     + ");";
 
-  std::cout << "add update Info : " << sql << std::endl;
   std::string errMsg;
   bool success = false;
   m_mutex.lock();
   util::MySQLPerformQuery(m_databaseHandler, sql, util::ADD, success, errMsg);
   m_mutex.unlock();
   if (!success)
-    std::cout << errMsg << std::endl;
+    _LOG_DEBUG(errMsg);
 }
 
 template <typename DatabaseHandler>
@@ -712,6 +721,7 @@
 PublishAdapter<DatabaseHandler>::onFetchUpdateDataTimeout(const ndn::Interest& interest)
 {
   // todo: record event, and use recovery Interest to fetch the whole table
+  _LOG_DEBUG("UpdateData retrieval timed out: " << interest.getName());
 }
 
 template <typename DatabaseHandler>
@@ -719,6 +729,8 @@
 PublishAdapter<DatabaseHandler>::processSyncUpdate(const std::vector<chronosync::MissingDataInfo>&
                                                    updates)
 {
+  _LOG_DEBUG(">> PublishAdapter::processSyncUpdate");
+
   if (updates.empty()) {
     return;
   }
@@ -740,7 +752,9 @@
                             bind(&PublishAdapter<DatabaseHandler>::onFetchUpdateDataTimeout,
                                  this, _1),
                             RETRY_WHEN_TIMEOUT);
-        std::cout << "send Interest for [" << updates[i].session << ":" << seq << "]" << std::endl;
+
+        _LOG_DEBUG("Interest for [" << updates[i].session << ":" << seq << "]");
+
         update = true;
       }
     }
@@ -772,7 +786,7 @@
   atmos::util::MySQLPerformQuery(m_databaseHandler, sql, op, success, errMsg);
   m_mutex.unlock();
   if (!success)
-    std::cout << errMsg << std::endl;
+    _LOG_DEBUG(errMsg);
 }
 
 template<typename DatabaseHandler>
@@ -782,7 +796,6 @@
                                           util::DatabaseOperation op)
 {
   if (jsonValue.type() != Json::objectValue) {
-    std::cout << jsonValue.toStyledString() << "is not json object" << std::endl;
     return false;
   }
   if (op == util::ADD) {
@@ -804,7 +817,7 @@
       // cast might be overflowed
       Json::Value item = jsonValue["add"][static_cast<int>(i)];
       if (!item.isConvertibleTo(Json::stringValue)) {
-        std::cout << "malformed JsonQuery string : " << item.toStyledString() << std::endl;
+        _LOG_DEBUG("malformed JsonQuery string");
         return false;
       }
       std::string fileName(item.asString());
@@ -827,14 +840,14 @@
     if (updateNumber <= 0)
       return false;
 
-    sqlString << "delete from " << m_databaseTable << " where name in (";
+    sqlString << "DELETE FROM " << m_databaseTable << " WHERE name IN (";
     for (size_t i = 0; i < updateNumber; ++i) {
       if (i > 0)
         sqlString << ",";
       // cast might be overflowed
       Json::Value item = jsonValue["remove"][static_cast<int>(i)];
       if (!item.isConvertibleTo(Json::stringValue)) {
-        std::cout << "malformed JsonQuery string : " << item.toStyledString() << std::endl;
+        _LOG_DEBUG("Malformed JsonQuery");
         return false;
       }
       std::string fileName(item.asString());
@@ -891,6 +904,8 @@
 PublishAdapter<DatabaseHandler>::validatePublicationChanges(const
                                                             std::shared_ptr<const ndn::Data>& data)
 {
+  _LOG_DEBUG(">> PublishAdapter::validatePublicationChanges");
+
   // The data name must be "/<publisher-prefix>/<nonce>"
   // the prefix is the data name removes the last component
   ndn::Name publisherPrefix = data->getName().getPrefix(-1);
@@ -901,7 +916,7 @@
   Json::Reader reader;
   if (!reader.parse(payload, parsedFromString)) {
     // parse error, log events
-    std::cout << "Cannot parse the published data " << data->getName() << " into Json" << std::endl;
+    _LOG_DEBUG("Fail to parse the published Data" << data->getName());
     return false;
   }
 
diff --git a/catalog/src/query/query-adapter.hpp b/catalog/src/query/query-adapter.hpp
index 0a5ae0b..435ad60 100644
--- a/catalog/src/query/query-adapter.hpp
+++ b/catalog/src/query/query-adapter.hpp
@@ -51,8 +51,15 @@
 #include <array>
 #include <utility>
 
+#include "util/logger.hpp"
+
+
 namespace atmos {
 namespace query {
+#ifdef HAVE_LOG4CXX
+  INIT_LOGGER("QueryAdapter");
+#endif
+
 // todo: calculate payload limit by get the size of a signed empty Data packet
 static const size_t PAYLOAD_LIMIT = 7000;
 
@@ -455,17 +462,15 @@
 QueryAdapter<DatabaseHandler>::onQueryInterest(const ndn::InterestFilter& filter,
                                                const ndn::Interest& interest)
 {
-  // strictly enforce query initialization namespace.
-  // Name should be our local prefix + "query" + parameters
+  _LOG_DEBUG(">> QueryAdapter::onQueryInterest");
+
   if (interest.getName().size() != filter.getPrefix().size() + 1) {
     // @todo: return a nack
     return;
   }
   std::shared_ptr<const ndn::Interest> interestPtr = interest.shared_from_this();
 
-#ifndef NDEBUG
-  std::cout << "incoming query interest : " << interestPtr->getName() << std::endl;
-#endif
+  _LOG_DEBUG("Interest : " << interestPtr->getName());
 
   // @todo: use thread pool
   std::thread queryThread(&QueryAdapter<DatabaseHandler>::runJsonQuery,
@@ -484,14 +489,14 @@
   // now. In the future, this should check some form of
   // InMemoryStorage.
 
-#ifndef NDEBUG
-  std::cout << "incoming query-results interest : " << interest.toUri() << std::endl;
-#endif
+  _LOG_DEBUG(">> QueryAdapter::onQueryResultsInterest");
 
   auto data = m_cache.find(interest.getName());
   if (data) {
     m_face->put(*data);
   }
+
+  _LOG_DEBUG("<< QueryAdapter::onQueryResultsInterest");
 }
 
 template <typename DatabaseHandler>
@@ -499,11 +504,11 @@
 QueryAdapter<DatabaseHandler>::onFiltersInitializationInterest(const ndn::InterestFilter& filter,
                                                            const ndn::Interest& interest)
 {
+  _LOG_DEBUG(">> QueryAdapter::onFiltersInitializationInterest");
   std::shared_ptr<const ndn::Interest> interestPtr = interest.shared_from_this();
 
-#ifndef NDEBUG
-  std::cout << "incoming initialization interest : " << interestPtr->getName() << std::endl;
-#endif
+  _LOG_DEBUG("Interest : " << interestPtr->getName());
+
   // TODO: save the content in memory, first check the memory, if not exists, start thread to generate it
   // Note that if ChronoSync state changes, we need to clear the saved value, and regenerate it
 
@@ -517,12 +522,15 @@
                             interestPtr);
     queryThread.join();
   }
+
+  _LOG_DEBUG("<< QueryAdapter::onFiltersInitializationInterest");
 }
 
 template <typename DatabaseHandler>
 void
 QueryAdapter<DatabaseHandler>::populateFiltersMenu(std::shared_ptr<const ndn::Interest> interest)
 {
+  _LOG_DEBUG(">> QueryAdapter::populateFiltersMenu");
   Json::Value filters;
   Json::FastWriter fastWriter;
   getFiltersMenu(filters);
@@ -545,16 +553,16 @@
       filterData->setContent(reinterpret_cast<const uint8_t*>(payload + startIndex), payloadLength);
 
       signData(*filterData);
-#ifndef NDEBUG
-      std::cout << "populate filter Data : " << segmentName << std::endl;
-#endif
+
+      _LOG_DEBUG("Populate Filter Data :" << segmentName);
+
       m_mutex.lock();
       m_cache.insert(*filterData);
       try {
         m_face->put(*filterData);
       }// catch exceptions and log
       catch (std::exception& e) {
-        std::cout << e.what() << std::endl;
+        _LOG_DEBUG(e.what());
       }
       m_mutex.unlock();
 
@@ -575,6 +583,7 @@
     m_face->put(*filterData);
     m_mutex.unlock();
   }
+  _LOG_DEBUG("<< QueryAdapter::populateFiltersMenu");
 }
 
 template <typename DatabaseHandler>
@@ -589,6 +598,7 @@
 void
 QueryAdapter<MYSQL>::getFiltersMenu(Json::Value& value)
 {
+  _LOG_DEBUG(">> QueryAdapter::getFiltersMenu");
   Json::Value tmp;
 
   for (size_t i = 0; i < m_filterCategoryNames.size(); i++) {
@@ -602,7 +612,7 @@
       = atmos::util::MySQLPerformQuery(m_databaseHandler, getFilterSql,
                                        util::QUERY, success, errMsg);
     if (!success) {
-      std::cout << errMsg << std::endl;
+      _LOG_DEBUG(errMsg);
       value.clear();
       return;
     }
@@ -615,9 +625,7 @@
     tmp.clear();
   }
 
-#ifndef NDEBUG
-  std::cout << value.toStyledString() << std::endl;
-#endif
+  _LOG_DEBUG("<< QueryAdapter::getFiltersMenu");
 }
 
 template <typename DatabaseHandler>
@@ -663,7 +671,7 @@
 
   signData(*ack);
 #ifndef NDEBUG
-  std::cout << "qurey-results data name in ACK : " << queryResultNameStr << std::endl;
+  _LOG_DEBUG(queryResultNameStr);
 #endif
   return ack;
 }
@@ -681,7 +689,7 @@
 
   signData(*nack);
 #ifndef NDEBUG
-  std::cout << "make NACK : " << ndn::Name(dataPrefix).appendSegment(segmentNo) << std::endl;
+  _LOG_DEBUG(ndn::Name(dataPrefix).appendSegment(segmentNo));
 #endif
   m_mutex.lock();
   m_cache.insert(*nack);
@@ -694,11 +702,11 @@
 QueryAdapter<DatabaseHandler>::json2Sql(std::stringstream& sqlQuery,
                                         Json::Value& jsonValue)
 {
+  _LOG_DEBUG(">> QueryAdapter::json2Sql");
 #ifndef NDEBUG
-  std::cout << "jsonValue in json2Sql: " << jsonValue.toStyledString() << std::endl;
+  _LOG_DEBUG(jsonValue.toStyledString());
 #endif
   if (jsonValue.type() != Json::objectValue) {
-    std::cout << jsonValue.toStyledString() << "is not json object" << std::endl;
     return false;
   }
 
@@ -710,13 +718,13 @@
     Json::Value value = (*iter);
 
     if (key == Json::nullValue || value == Json::nullValue) {
-      std::cout << "null key or value in JsonValue: " << jsonValue.toStyledString() << std::endl;
+      _LOG_DEBUG("null key or value in JsonValue");
       return false;
     }
 
     // cannot convert to string
     if (!key.isConvertibleTo(Json::stringValue) || !value.isConvertibleTo(Json::stringValue)) {
-      std::cout << "malformed JsonQuery string : " << jsonValue.toStyledString() << std::endl;
+      _LOG_DEBUG("malformed JsonQuery string");
       return false;
     }
 
@@ -747,11 +755,11 @@
                                                       Json::Value& jsonValue,
                                                       bool& lastComponent)
 {
+  _LOG_DEBUG(">> QueryAdapter::json2AutocompletionSql");
 #ifndef NDEBUG
-  std::cout << "jsonValue in json2AutocompletionSql: " << jsonValue.toStyledString() << std::endl;
+  _LOG_DEBUG(jsonValue.toStyledString());
 #endif
   if (jsonValue.type() != Json::objectValue) {
-    std::cout << jsonValue.toStyledString() << "is not json object" << std::endl;
     return false;
   }
 
@@ -763,13 +771,13 @@
     Json::Value value = (*iter);
 
     if (key == Json::nullValue || value == Json::nullValue) {
-      std::cout << "null key or value in JsonValue: " << jsonValue.toStyledString() << std::endl;
+      _LOG_DEBUG("null key or value in JsonValue");
       return false;
     }
 
     // cannot convert to string
     if (!key.isConvertibleTo(Json::stringValue) || !value.isConvertibleTo(Json::stringValue)) {
-      std::cout << "malformed JsonQuery string : " << jsonValue.toStyledString() << std::endl;
+      _LOG_DEBUG("malformed JsonQuery string");
       return false;
     }
 
@@ -829,11 +837,11 @@
 QueryAdapter<DatabaseHandler>::json2PrefixBasedSearchSql(std::stringstream& sqlQuery,
                                                          Json::Value& jsonValue)
 {
+  _LOG_DEBUG(">> QueryAdapter::json2CompleteSearchSql");
 #ifndef NDEBUG
-  std::cout << "jsonValue in json2PrefixBasedSearchSql: " << jsonValue.toStyledString() << std::endl;
+  _LOG_DEBUG(jsonValue.toStyledString());
 #endif
   if (jsonValue.type() != Json::objectValue) {
-    std::cout << jsonValue.toStyledString() << "is not json object" << std::endl;
     return false;
   }
 
@@ -845,13 +853,13 @@
     Json::Value value = (*iter);
 
     if (key == Json::nullValue || value == Json::nullValue) {
-      std::cout << "null key or value in JsonValue: " << jsonValue.toStyledString() << std::endl;
+      _LOG_DEBUG("null key or value in JsonValue");
       return false;
     }
 
     // cannot convert to string
     if (!key.isConvertibleTo(Json::stringValue) || !value.isConvertibleTo(Json::stringValue)) {
-      std::cout << "malformed JsonQuery string : " << jsonValue.toStyledString() << std::endl;
+      _LOG_DEBUG("malformed JsonQuery string");
       return false;
     }
 
@@ -913,6 +921,8 @@
 void
 QueryAdapter<DatabaseHandler>::runJsonQuery(std::shared_ptr<const ndn::Interest> interest)
 {
+  _LOG_DEBUG(">> QueryAdapter::runJsonQuery");
+
   // 1) Strip the prefix off the ndn::Interest's ndn::Name
   // +1 to grab JSON component after "query" component
 
@@ -947,7 +957,7 @@
   Json::Reader reader;
   if (!reader.parse(jsonQuery, parsedFromString)) {
     // @todo: send NACK?
-    std::cout << "cannot parse the JsonQuery" << std::endl;
+    _LOG_DEBUG("cannot parse the JsonQuery");
     return;
   }
 
@@ -1027,8 +1037,9 @@
                                      bool autocomplete,
                                      bool lastComponent)
 {
+  _LOG_DEBUG(">> QueryAdapter::prepareSegments");
 #ifndef NDEBUG
-  std::cout << "prepareSegments() executes sql : " << sqlString << std::endl;
+  _LOG_DEBUG(sqlString);
 #endif
   std::string errMsg;
   bool success;
@@ -1036,10 +1047,10 @@
   std::shared_ptr<MYSQL_RES> results
     = atmos::util::MySQLPerformQuery(m_databaseHandler, sqlString, util::QUERY, success, errMsg);
   if (!success)
-    std::cout << errMsg << std::endl;
+    _LOG_DEBUG(errMsg);
 
   if (!results) {
-    std::cout << "null MYSQL_RES for query : " << sqlString << std::endl;
+    _LOG_DEBUG("NULL MYSQL_RES for" << sqlString);
 
     // @todo: throw runtime error or log the error message?
     return;
@@ -1048,11 +1059,7 @@
   uint64_t resultCount = mysql_num_rows(results.get());
 
 #ifndef NDEBUG
-  std::cout << "Query results for \""
-            << sqlString
-            << "\" contain "
-            << resultCount
-            << " rows" << std::endl;
+  _LOG_DEBUG("Query resuls contain " << resultCount << "rows");
 #endif
 
   MYSQL_ROW row;
@@ -1113,9 +1120,9 @@
     entry["lastComponent"] = Json::Value(true);
 
 #ifndef NDEBUG
-  std::cout << "resultCount " << resultCount
-            << "; viewStart " << viewStart
-            << "; viewEnd "   << viewEnd << std::endl;
+  _LOG_DEBUG("resultCount " << resultCount << ";"
+             << "viewStart " << viewStart << ";"
+             << "viewEnd " << viewEnd);
 #endif
 
   if (isAutocomplete) {
@@ -1137,7 +1144,7 @@
     data->setFinalBlockId(ndn::Name::Component::fromSegment(segmentNo));
   }
 #ifndef NDEBUG
-  std::cout << "makeReplyData : " << segmentName << std::endl;
+  _LOG_DEBUG(segmentName);
 #endif
   signData(*data);
   return data;
diff --git a/catalog/src/util/logger.hpp b/catalog/src/util/logger.hpp
new file mode 100644
index 0000000..3e2d8dd
--- /dev/null
+++ b/catalog/src/util/logger.hpp
@@ -0,0 +1,80 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2012-2015 University of California, Los Angeles,
+ *               2015      Colorado State University
+ *
+ * This file is part of ChronoSync, synchronization library for distributed realtime
+ * applications for NDN.
+ *
+ * ChronoSync 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.
+ *
+ * ChronoSync 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
+ * ChronoSync, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author Zhenkai Zhu <http://irl.cs.ucla.edu/~zhenkai/>
+ * @author Chaoyi Bian <bcy@pku.edu.cn>
+ * @author Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
+ * @author Chengyu Fan <chengyu@cs.colostate.edu>
+ */
+
+#ifndef ATMOS_CATALOG_LOGGER_HPP
+#define ATMOS_CATALOG_LOGGER_HPP
+
+#ifdef HAVE_LOG4CXX
+
+#include <log4cxx/logger.h>
+#include <log4cxx/propertyconfigurator.h>
+
+#define INIT_LOGGER(name) \
+  static log4cxx::LoggerPtr staticModuleLogger = log4cxx::Logger::getLogger(name)
+
+#define _LOG_DEBUG(x) \
+  LOG4CXX_DEBUG(staticModuleLogger, x)
+
+#define _LOG_TRACE(x) \
+  LOG4CXX_TRACE(staticModuleLogger, x)
+
+#define _LOG_FUNCTION(x) \
+  LOG4CXX_TRACE(staticModuleLogger, __FUNCTION__ << "(" << x << ")")
+
+#define _LOG_FUNCTION_NOARGS \
+  LOG4CXX_TRACE(staticModuleLogger, __FUNCTION__ << "()")
+
+#define _LOG_ERROR(x) \
+  LOG4CXX_ERROR(staticModuleLogger, x)
+
+#else // HAVE_LOG4CXX
+
+#define INIT_LOGGER(name)
+#define _LOG_FUNCTION(x)
+#define _LOG_FUNCTION_NOARGS
+#define _LOG_TRACE(x)
+#define INIT_LOGGERS(x)
+#define _LOG_ERROR(x)
+
+#ifdef _DEBUG
+
+#include <thread>
+#include <iostream>
+#include <ndn-cxx/util/time.hpp>
+
+// to print out messages, must be in debug mode
+#define _LOG_DEBUG(x) \
+  std::clog << ndn::time::system_clock::now() << " " << std::this_thread::get_id() << \
+               " " << x << std::endl
+
+#else // _DEBUG
+
+#define _LOG_DEBUG(x)
+
+#endif // _DEBUG
+
+#endif // HAVE_LOG4CXX
+
+#endif // ATMOS_CATALOG_LOGGER_HPP
