src: Add additional log levels

refs: #1935

Change-Id: Ie3ef3f04fbcadd8fb9ee6f3aade4a35bd2a88105
diff --git a/nlsr.conf b/nlsr.conf
index 48f34a6..f204d12 100644
--- a/nlsr.conf
+++ b/nlsr.conf
@@ -14,9 +14,21 @@
   ; InterestLifetime (in seconds) for LSA fetching
   lsa-interest-lifetime 4    ; default value 4. Valid values 1-60
 
-  ; log-level is to set the levels of log for NLSR
+  ; log-level is used to set the logging level for NLSR.
+  ; All debugging levels listed above the selected value are enabled.
+  ;
+  ; Valid values:
+  ;
+  ;  NONE ; no messages
+  ;  ERROR ; error messages
+  ;  WARN ; warning messages
+  ;  INFO ; informational messages (default)
+  ;  DEBUG ; debugging messages
+  ;  TRACE ; trace messages (most verbose)
+  ;  ALL ; all messages
 
-  log-level  INFO       ; default value INFO, valid value DEBUG, INFO
+  log-level  INFO
+
   log-dir /var/log/nlsr/  ; path for log directory (Absolute path)
   seq-dir /var/lib/nlsr/  ; path for sequence directory (Absolute path)
 }
diff --git a/src/conf-file-processor.cpp b/src/conf-file-processor.cpp
index 5f3c147..726d2af 100644
--- a/src/conf-file-processor.cpp
+++ b/src/conf-file-processor.cpp
@@ -189,13 +189,15 @@
   }
 
   try {
+
     std::string logLevel = section.get<string>("log-level");
-    if ( boost::iequals(logLevel, "info") || boost::iequals(logLevel, "debug")) {
+
+    if (isValidLogLevel(logLevel)) {
       m_nlsr.getConfParameter().setLogLevel(logLevel);
     }
     else {
-      std::cerr << "Wrong value for log-level ";
-      std::cerr << "Allowed value: INFO, DEBUG" << std::endl;
+      std::cerr << "Invalid value for log-level ";
+      std::cerr << "Valid values: ALL, TRACE, DEBUG, INFO, WARN, ERROR, NONE" << std::endl;
       return false;
     }
   }
diff --git a/src/logger.cpp b/src/logger.cpp
index 933f4a3..a82f5a9 100644
--- a/src/logger.cpp
+++ b/src/logger.cpp
@@ -27,24 +27,48 @@
 #include <log4cxx/helpers/exception.h>
 #include <log4cxx/rollingfileappender.h>
 
+#include <boost/algorithm/string.hpp>
+
 #include "logger.hpp"
 
 void
-INIT_LOGGERS(const std::string& logDir)
+INIT_LOGGERS(const std::string& logDir, const std::string& logLevel)
 {
   static bool configured = false;
-  if (configured) return;
+
+  if (configured) {
+    return;
+  }
 
   log4cxx::PatternLayoutPtr
-           layout(new log4cxx::PatternLayout("%date{yyyyMMddHHmmssSSS} %c %L: %m%n"));
+           layout(new log4cxx::PatternLayout("%date{yyyyMMddHHmmssSSS} %p: [%c] %m%n"));
+
   log4cxx::RollingFileAppender* rollingFileAppender =
            new log4cxx::RollingFileAppender(layout, logDir+"/nlsr.log", true);
+
   rollingFileAppender->setMaxFileSize("10MB");
   rollingFileAppender->setMaxBackupIndex(10);
+
   log4cxx::helpers::Pool p;
   rollingFileAppender->activateOptions(p);
+
   log4cxx::BasicConfigurator::configure(log4cxx::AppenderPtr(rollingFileAppender));
-  log4cxx::Logger::getRootLogger()->setLevel(log4cxx::Level::getDebug());
+
+  if (boost::iequals(logLevel, "none")) {
+    log4cxx::Logger::getRootLogger()->setLevel(log4cxx::Level::getOff());
+  }
+  else {
+    log4cxx::Logger::getRootLogger()->setLevel(log4cxx::Level::toLevel(logLevel));
+  }
 
   configured = true;
 }
+
+bool
+isValidLogLevel(const std::string& logLevel)
+{
+  return boost::iequals(logLevel, "all")   || boost::iequals(logLevel, "trace") ||
+         boost::iequals(logLevel, "debug") || boost::iequals(logLevel, "info")  ||
+         boost::iequals(logLevel, "warn")  || boost::iequals(logLevel, "error") ||
+         boost::iequals(logLevel, "none");
+}
diff --git a/src/logger.hpp b/src/logger.hpp
index 6a487fb..267f30f 100644
--- a/src/logger.hpp
+++ b/src/logger.hpp
@@ -25,17 +25,31 @@
 
 #include <log4cxx/logger.h>
 
-
 #define INIT_LOGGER(name) \
   static log4cxx::LoggerPtr staticModuleLogger = log4cxx::Logger::getLogger(name)
 
+#define _LOG_TRACE(x) \
+  LOG4CXX_TRACE(staticModuleLogger, x)
+
 #define _LOG_DEBUG(x) \
-  LOG4CXX_DEBUG(staticModuleLogger,x)
+  LOG4CXX_DEBUG(staticModuleLogger, x)
 
 #define _LOG_INFO(x) \
   LOG4CXX_INFO(staticModuleLogger, x)
 
+#define _LOG_WARN(x) \
+  LOG4CXX_WARN(staticModuleLogger, x)
+
+#define _LOG_ERROR(x) \
+  LOG4CXX_ERROR(staticModuleLogger, x)
+
+#define _LOG_FATAL(x) \
+  LOG4CXX_FATAL(staticModuleLogger, x);
+
 void
-INIT_LOGGERS(const std::string& logDir);
+INIT_LOGGERS(const std::string& logDir, const std::string& logLevel);
+
+bool
+isValidLogLevel(const std::string& logLevel);
 
 #endif // NLSR_LOGGER_HPP
diff --git a/src/main.cpp b/src/main.cpp
index 752843a..aafca1d 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -60,8 +60,10 @@
     std::cerr << "Error in configuration file processing! Exiting from NLSR" << std::endl;
     return EXIT_FAILURE;
   }
-  INIT_LOGGERS(nlsr.getConfParameter().getLogDir());
+
+  INIT_LOGGERS(nlsr.getConfParameter().getLogDir(), nlsr.getConfParameter().getLogLevel());
   INIT_LOGGER("Main");
+
   nlsr.initialize();
   if (nlsr.getIsSetDaemonProcess()) {
     nlsr.daemonize();
diff --git a/tests/test-lsdb.cpp b/tests/test-lsdb.cpp
index b6305b9..430458d 100644
--- a/tests/test-lsdb.cpp
+++ b/tests/test-lsdb.cpp
@@ -35,7 +35,7 @@
 
 BOOST_AUTO_TEST_CASE(LsdbRemoveAndExists)
 {
-  INIT_LOGGERS("/tmp");
+  INIT_LOGGERS("/tmp", "DEBUG");
 
   Nlsr nlsr1;
   ndn::time::system_clock::TimePoint testTimePoint =  ndn::time::system_clock::now();