Pārlūkot izejas kodu

2008-05-16 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>

	Added --log-level option to specify log level. Log messages under
	the specified level are not output. Default value is `debug'.
	* src/HelpItemFactory.cc
	* src/LogFactory.cc
	* src/LogFactory.h
	* src/Logger.h
	* src/OptionHandlerFactory.cc
	* src/SimpleLogger.cc
	* src/SimpleLogger.h
	* src/main.cc
	* src/option_processing.cc
	* src/prefs.h
	* src/usage_text.h
Tatsuhiro Tsujikawa 17 gadi atpakaļ
vecāks
revīzija
d76e423884

+ 16 - 0
ChangeLog

@@ -1,3 +1,19 @@
+2008-05-16  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
+
+	Added --log-level option to specify log level. Log messages under
+	the specified level are not output. Default value is `debug'.
+	* src/HelpItemFactory.cc
+	* src/LogFactory.cc
+	* src/LogFactory.h
+	* src/Logger.h
+	* src/OptionHandlerFactory.cc
+	* src/SimpleLogger.cc
+	* src/SimpleLogger.h
+	* src/main.cc
+	* src/option_processing.cc
+	* src/prefs.h
+	* src/usage_text.h
+
 2008-05-15  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
 
 	Print download progress summary of all parallel downloads in specified

+ 9 - 0
src/HelpItemFactory.cc

@@ -477,6 +477,15 @@ TagContainerHandle HelpItemFactory::createHelpItems(const Option* op)
     item->addTag(TAG_ADVANCED);
     tc->addItem(item);
   }
+  {
+    HelpItemHandle item(new HelpItem(PREF_LOG_LEVEL,
+				     TEXT_LOG_LEVEL,
+				     op->get(PREF_LOG_LEVEL)));
+    item->addTag(TAG_ADVANCED);
+    item->setAvailableValues
+      (StringFormat("%s,%s,%s,%s,%s", V_DEBUG, V_INFO, V_NOTICE, V_WARN, V_ERROR).str());
+    tc->addItem(item);
+  }
   {
     HelpItemHandle item(new HelpItem("help", TEXT_HELP, TAG_BASIC));
     item->setAvailableValues

+ 24 - 0
src/LogFactory.cc

@@ -35,17 +35,21 @@
 #include "LogFactory.h"
 #include "SimpleLogger.h"
 #include "a2io.h"
+#include "prefs.h"
+#include <cstring>
 
 namespace aria2 {
 
 std::string LogFactory::filename = DEV_NULL;
 Logger* LogFactory::logger = 0;
 bool LogFactory::_consoleOutput = true;
+Logger::LEVEL LogFactory::_logLevel = Logger::DEBUG;
 
 Logger* LogFactory::getInstance() {
   if(logger == NULL) {
     SimpleLogger* slogger = new SimpleLogger();
     slogger->openFile(filename);
+    slogger->setLogLevel(_logLevel);
     if(_consoleOutput) {
       slogger->setStdout(Logger::NOTICE, true);
       slogger->setStdout(Logger::WARN, true);
@@ -56,6 +60,26 @@ Logger* LogFactory::getInstance() {
   return logger;
 }
 
+void LogFactory::setLogLevel(Logger::LEVEL level)
+{
+  _logLevel = level;
+}
+
+void LogFactory::setLogLevel(const std::string& level)
+{
+  if(strcmp(level.c_str(), V_DEBUG) == 0) {
+    _logLevel = Logger::DEBUG;
+  } else if(strcmp(level.c_str(), V_INFO) == 0) {
+    _logLevel = Logger::INFO;
+  } else if(strcmp(level.c_str(), V_NOTICE) == 0) {
+    _logLevel = Logger::NOTICE;
+  } else if(strcmp(level.c_str(), V_WARN) == 0) {
+    _logLevel = Logger::WARN;
+  } else if(strcmp(level.c_str(), V_ERROR) == 0) {
+    _logLevel = Logger::ERROR;
+  }
+}
+
 void LogFactory::release() {
   delete logger;
   logger = 0;

+ 14 - 2
src/LogFactory.h

@@ -36,17 +36,17 @@
 #define _D_LOG_FACTORY_H_
 
 #include "common.h"
+#include "Logger.h"
 #include <string>
 
 namespace aria2 {
 
-class Logger;
-
 class LogFactory {
 private:
   static std::string filename;
   static Logger* logger;
   static bool _consoleOutput;
+  static Logger::LEVEL _logLevel;
 public:
   /**
    * Get logger instance. Returned logger is singleton.
@@ -69,6 +69,18 @@ public:
     _consoleOutput = f;
   }
 
+
+  /**
+   * Set log level to output.
+   */
+  static void setLogLevel(Logger::LEVEL level);
+
+  /**
+   * Set log level to output by string represention of log level.
+   * Possible values are: debug, info, notice, warn, error
+   */
+  static void setLogLevel(const std::string& level);
+
   /**
    * Releases used resources
    */

+ 2 - 0
src/Logger.h

@@ -62,6 +62,8 @@ public:
     WARN   = 1 << 3,
     ERROR  = 1 << 4,
   };
+
+  virtual void setLogLevel(LEVEL level) = 0;
 };
 
 } // namespace aria2

+ 7 - 0
src/OptionHandlerFactory.cc

@@ -133,6 +133,13 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers()
 #endif // ENABLE_ASYNC_DNS
   handlers.push_back(SH(new BooleanOptionHandler(PREF_FTP_REUSE_CONNECTION)));
   handlers.push_back(SH(new NumberOptionHandler(PREF_SUMMARY_INTERVAL, 0, INT32_MAX)));
+  {
+    const char* params[] = { V_DEBUG, V_INFO, V_NOTICE, V_WARN, V_ERROR };
+    handlers.push_back(SH(new ParameterOptionHandler
+			  (PREF_LOG_LEVEL,
+			   std::deque<std::string>(&params[0],
+						   &params[arrayLength(params)]))));
+  }
   return handlers;
 }
 

+ 25 - 16
src/SimpleLogger.cc

@@ -56,19 +56,23 @@ namespace aria2 {
 #endif
 
 #define WRITE_LOG(LEVEL, MSG) \
+if(LEVEL >= _logLevel){\
 va_list ap;\
 va_start(ap, MSG);\
-writeFile(Logger::LEVEL, MSG, ap);\
+writeFile(LEVEL, MSG, ap);\
 flush();\
-va_end(ap);
+va_end(ap);\
+}
 
 #define WRITE_LOG_EX(LEVEL, MSG, EX) \
+if(LEVEL >= _logLevel) {\
 va_list ap;\
 va_start(ap, EX);\
-writeFile(Logger::LEVEL, MSG, ap);\
-writeStackTrace(Logger::LEVEL, EX);\
+writeFile(LEVEL, MSG, ap);\
+writeStackTrace(LEVEL, EX);\
 flush();\
-va_end(ap);
+va_end(ap);\
+}
 
 const std::string SimpleLogger::DEBUG("DEBUG");
 
@@ -80,7 +84,7 @@ const std::string SimpleLogger::ERROR("ERROR");
 
 const std::string SimpleLogger::INFO("INFO");
 
-SimpleLogger::SimpleLogger():stdoutField(0) {}
+SimpleLogger::SimpleLogger():stdoutField(0), _logLevel(Logger::DEBUG) {}
 
 SimpleLogger::~SimpleLogger() {
   closeFile();
@@ -184,43 +188,48 @@ void SimpleLogger::flush()
 }
 
 void SimpleLogger::debug(const char* msg, ...) {
-  WRITE_LOG(DEBUG, msg);
+  WRITE_LOG(Logger::DEBUG, msg);
 }
 
 void SimpleLogger::debug(const char* msg, const Exception& e, ...) {
-  WRITE_LOG_EX(DEBUG, msg, e);
+  WRITE_LOG_EX(Logger::DEBUG, msg, e);
 }
 
 void SimpleLogger::info(const char* msg, ...) {
-  WRITE_LOG(INFO, msg);
+  WRITE_LOG(Logger::INFO, msg);
 }
 
 void SimpleLogger::info(const char* msg, const Exception& e, ...) {
-  WRITE_LOG_EX(INFO, msg, e);
+  WRITE_LOG_EX(Logger::INFO, msg, e);
 }
 
 void SimpleLogger::notice(const char* msg, ...) {
-  WRITE_LOG(NOTICE, msg);
+  WRITE_LOG(Logger::NOTICE, msg);
 }
 
 void SimpleLogger::notice(const char* msg, const Exception& e, ...) {
-  WRITE_LOG_EX(INFO, msg, e);
+  WRITE_LOG_EX(Logger::INFO, msg, e);
 }
 
 void SimpleLogger::warn(const char* msg, ...) {
-  WRITE_LOG(WARN, msg);
+  WRITE_LOG(Logger::WARN, msg);
 }
 
 void SimpleLogger::warn(const char* msg, const Exception& e, ...) {
-  WRITE_LOG_EX(WARN, msg, e);
+  WRITE_LOG_EX(Logger::WARN, msg, e);
 }
 
 void SimpleLogger::error(const char* msg, ...) {
-  WRITE_LOG(ERROR, msg);
+  WRITE_LOG(Logger::ERROR, msg);
 }
 
 void SimpleLogger::error(const char* msg, const Exception& e, ...) {
-  WRITE_LOG_EX(ERROR, msg, e);
+  WRITE_LOG_EX(Logger::ERROR, msg, e);
+}
+
+void SimpleLogger::setLogLevel(Logger::LEVEL level)
+{
+  _logLevel = level;
 }
 
 } // namespace aria2

+ 4 - 0
src/SimpleLogger.h

@@ -60,6 +60,8 @@ private:
   std::ofstream file;
   int stdoutField;
 
+  Logger::LEVEL _logLevel;
+
   static const std::string DEBUG;
 
   static const std::string NOTICE;
@@ -86,6 +88,8 @@ public:
   virtual void error(const char* msg, ...);
   virtual void error(const char* msg, const Exception& ex, ...);
 
+  virtual void setLogLevel(Logger::LEVEL level);
+
   void setStdout(Logger::LEVEL level, bool enabled);
 };
 

+ 1 - 0
src/main.cc

@@ -339,6 +339,7 @@ int main(int argc, char* argv[])
   } else {
     LogFactory::setLogFile(DEV_NULL);
   }
+  LogFactory::setLogLevel(op->get(PREF_LOG_LEVEL));
   if(op->getAsBool(PREF_QUIET)) {
     LogFactory::setConsoleOutput(false);
   }

+ 5 - 0
src/option_processing.cc

@@ -152,6 +152,7 @@ Option* createDefaultOption()
 #endif // ENABLE_ASYNC_DNS
   op->put(PREF_FTP_REUSE_CONNECTION, V_TRUE);
   op->put(PREF_SUMMARY_INTERVAL, "60");
+  op->put(PREF_LOG_LEVEL, V_DEBUG);
   return op;
 }
 
@@ -228,6 +229,7 @@ Option* option_processing(int argc, char* const argv[])
 #endif // ENABLE_ASYNC_DNS
       { PREF_FTP_REUSE_CONNECTION, optional_argument, &lopt, 217 },
       { PREF_SUMMARY_INTERVAL, required_argument, &lopt, 218 },
+      { PREF_LOG_LEVEL, required_argument, &lopt, 219 },
 #if defined ENABLE_BITTORRENT || ENABLE_METALINK
       { PREF_SHOW_FILES, no_argument, NULL, 'S' },
       { PREF_SELECT_FILE, required_argument, &lopt, 21 },
@@ -440,6 +442,9 @@ Option* option_processing(int argc, char* const argv[])
       case 218:
 	cmdstream << PREF_SUMMARY_INTERVAL << "=" << optarg << "\n";
 	break;
+      case 219:
+	cmdstream << PREF_LOG_LEVEL << "=" << optarg << "\n";
+	break;
       }
       break;
     }

+ 7 - 0
src/prefs.h

@@ -132,6 +132,13 @@
 #define PREF_ASYNC_DNS "async-dns"
 // value: 1*digit
 #define PREF_SUMMARY_INTERVAL "summary-interval"
+// value: debug, info, notice, warn, error
+#define PREF_LOG_LEVEL "log-level"
+#  define V_DEBUG "debug"
+#  define V_INFO "info"
+#  define V_NOTICE "notice"
+#  define V_WARN "warn"
+#  define V_ERROR "error"
 
 /**
  * FTP related preferences

+ 2 - 0
src/usage_text.h

@@ -341,3 +341,5 @@ _(" --ftp-reuse-connection[=true|false] Reuse connection in FTP.")
 #define TEXT_SUMMARY_INTERVAL \
 _(" --summary-interval=SEC       Set interval to output download progress summary.\n"\
   "                              Setting 0 suppresses the output.")
+#define TEXT_LOG_LEVEL \
+_(" --log-level=LEVEL            Set log level to output.")