Added --console-log-level option

--console-log-level option sets log level to output to console.
pull/43/head
Tatsuhiro Tsujikawa 2013-01-05 18:48:09 +09:00
parent f019eae5df
commit d6000024c0
9 changed files with 113 additions and 50 deletions

View File

@ -43,6 +43,7 @@ std::string LogFactory::filename_ = DEV_NULL;
SharedHandle<Logger> LogFactory::logger_; SharedHandle<Logger> LogFactory::logger_;
bool LogFactory::consoleOutput_ = true; bool LogFactory::consoleOutput_ = true;
Logger::LEVEL LogFactory::logLevel_ = Logger::A2_DEBUG; Logger::LEVEL LogFactory::logLevel_ = Logger::A2_DEBUG;
Logger::LEVEL LogFactory::consoleLogLevel_ = Logger::A2_NOTICE;
void LogFactory::openLogger(const SharedHandle<Logger>& logger) void LogFactory::openLogger(const SharedHandle<Logger>& logger)
{ {
@ -52,6 +53,8 @@ void LogFactory::openLogger(const SharedHandle<Logger>& logger)
logger->openFile(filename_); logger->openFile(filename_);
} }
logger->setLogLevel(logLevel_); logger->setLogLevel(logLevel_);
logger->setConsoleLogLevel(consoleLogLevel_);
logger->setConsoleOutput(consoleOutput_);
} }
void LogFactory::reconfigure() void LogFactory::reconfigure()
@ -72,11 +75,6 @@ const SharedHandle<Logger>& LogFactory::getInstance()
if(!logger_) { if(!logger_) {
SharedHandle<Logger> slogger(new Logger()); SharedHandle<Logger> slogger(new Logger());
openLogger(slogger); openLogger(slogger);
if(consoleOutput_) {
slogger->setStdoutLogLevel(Logger::A2_NOTICE, true);
slogger->setStdoutLogLevel(Logger::A2_WARN, true);
slogger->setStdoutLogLevel(Logger::A2_ERROR, true);
}
logger_.swap(slogger); logger_.swap(slogger);
} }
return logger_; return logger_;
@ -93,6 +91,25 @@ void LogFactory::setLogFile(const std::string& name)
} }
} }
namespace {
Logger::LEVEL toLogLevel(const std::string& level)
{
if(level == V_DEBUG) {
return Logger::A2_DEBUG;
} else if(level == V_INFO) {
return Logger::A2_INFO;
} else if(level == V_NOTICE) {
return Logger::A2_NOTICE;
} else if(level == V_WARN) {
return Logger::A2_WARN;
} else if(level == V_ERROR) {
return Logger::A2_ERROR;
} else {
return Logger::A2_NOTICE;
}
}
} // namespace
void LogFactory::setLogLevel(Logger::LEVEL level) void LogFactory::setLogLevel(Logger::LEVEL level)
{ {
logLevel_ = level; logLevel_ = level;
@ -100,17 +117,17 @@ void LogFactory::setLogLevel(Logger::LEVEL level)
void LogFactory::setLogLevel(const std::string& level) void LogFactory::setLogLevel(const std::string& level)
{ {
if(level == V_DEBUG) { logLevel_ = toLogLevel(level);
logLevel_ = Logger::A2_DEBUG; }
} else if(level == V_INFO) {
logLevel_ = Logger::A2_INFO; void LogFactory::setConsoleLogLevel(Logger::LEVEL level)
} else if(level == V_NOTICE) { {
logLevel_ = Logger::A2_NOTICE; consoleLogLevel_ = level;
} else if(level == V_WARN) { }
logLevel_ = Logger::A2_WARN;
} else if(level == V_ERROR) { void LogFactory::setConsoleLogLevel(const std::string& level)
logLevel_ = Logger::A2_ERROR; {
} consoleLogLevel_ = toLogLevel(level);
} }
void LogFactory::release() { void LogFactory::release() {

View File

@ -50,6 +50,7 @@ private:
static SharedHandle<Logger> logger_; static SharedHandle<Logger> logger_;
static bool consoleOutput_; static bool consoleOutput_;
static Logger::LEVEL logLevel_; static Logger::LEVEL logLevel_;
static Logger::LEVEL consoleLogLevel_;
static void openLogger(const SharedHandle<Logger>& logger); static void openLogger(const SharedHandle<Logger>& logger);
@ -77,16 +78,27 @@ public:
} }
/** /**
* Set log level to output. * Set log level to output to file.
*/ */
static void setLogLevel(Logger::LEVEL level); static void setLogLevel(Logger::LEVEL level);
/** /**
* Set log level to output by string represention of log level. * Set log level to output to file by string represention of log
* Possible values are: debug, info, notice, warn, error * level. Possible values are: debug, info, notice, warn, error
*/ */
static void setLogLevel(const std::string& level); static void setLogLevel(const std::string& level);
/**
* Set log level to output to console.
*/
static void setConsoleLogLevel(Logger::LEVEL level);
/**
* Set log level to output to console by string represention of log
* level. Possible values are: debug, info, notice, warn, error
*/
static void setConsoleLogLevel(const std::string& level);
/** /**
* Releases used resources * Releases used resources
*/ */

View File

@ -51,7 +51,8 @@ namespace aria2 {
Logger::Logger() Logger::Logger()
: logLevel_(Logger::A2_DEBUG), : logLevel_(Logger::A2_DEBUG),
stdoutField_(0), consoleLogLevel_(Logger::A2_NOTICE),
consoleOutput_(true),
#ifdef __MINGW32__ #ifdef __MINGW32__
// Windows DOS prompt does not handle ANSI color code, so make // Windows DOS prompt does not handle ANSI color code, so make
// this false. // this false.
@ -85,18 +86,24 @@ void Logger::closeFile()
} }
} }
void Logger::setStdoutLogLevel(Logger::LEVEL level, bool enabled) void Logger::setConsoleOutput(bool enabled)
{ {
if(enabled) { consoleOutput_ = enabled;
stdoutField_ |= level; }
} else {
stdoutField_ &= ~level; bool Logger::fileLogEnabled(LEVEL level)
} {
return level >= logLevel_ && fpp_;
}
bool Logger::consoleLogEnabled(LEVEL level)
{
return consoleOutput_ && level >= consoleLogLevel_;
} }
bool Logger::levelEnabled(LEVEL level) bool Logger::levelEnabled(LEVEL level)
{ {
return (level >= logLevel_ && fpp_) || stdoutField_&level; return fileLogEnabled(level) || consoleLogEnabled(level);
} }
namespace { namespace {
@ -144,9 +151,9 @@ const char* levelColor(Logger::LEVEL level)
{ {
switch(level) { switch(level) {
case Logger::A2_DEBUG: case Logger::A2_DEBUG:
return "\033[1;37m";
case Logger::A2_INFO: case Logger::A2_INFO:
// We don't print these levels in console return "\033[1;36m";
return "";
case Logger::A2_NOTICE: case Logger::A2_NOTICE:
return "\033[1;32m"; return "\033[1;32m";
case Logger::A2_WARN: case Logger::A2_WARN:
@ -173,9 +180,9 @@ void writeHeaderConsole(Output& fp, Logger::LEVEL level, bool useColor)
namespace { namespace {
template<typename Output> template<typename Output>
void writeStackTrace(Output& fp, const std::string& stackTrace) void writeStackTrace(Output& fp, const char* stackTrace)
{ {
fp.write(stackTrace.c_str()); fp.write(stackTrace);
} }
} // namespace } // namespace
@ -184,17 +191,15 @@ void Logger::writeLog
const char* sourceFile, const char* sourceFile,
int lineNum, int lineNum,
const char* msg, const char* msg,
const std::string& trace, const char* trace)
bool toStream,
bool toConsole)
{ {
if(toStream) { if(fileLogEnabled(level)) {
writeHeader(*fpp_, level, sourceFile, lineNum); writeHeader(*fpp_, level, sourceFile, lineNum);
fpp_->printf("%s\n", msg); fpp_->printf("%s\n", msg);
writeStackTrace(*fpp_, trace); writeStackTrace(*fpp_, trace);
fpp_->flush(); fpp_->flush();
} }
if(toConsole) { if(consoleLogEnabled(level)) {
global::cout()->printf("\n"); global::cout()->printf("\n");
writeHeaderConsole(*global::cout(), level, useColor_); writeHeaderConsole(*global::cout(), level, useColor_);
global::cout()->printf("%s\n", msg); global::cout()->printf("%s\n", msg);
@ -209,9 +214,7 @@ void Logger::log
int lineNum, int lineNum,
const char* msg) const char* msg)
{ {
writeLog(level, sourceFile, lineNum, msg, A2STR::NIL, writeLog(level, sourceFile, lineNum, msg, "");
level >= logLevel_ && fpp_,
stdoutField_&level);
} }
void Logger::log void Logger::log
@ -230,9 +233,7 @@ void Logger::log
const char* msg, const char* msg,
const Exception& ex) const Exception& ex)
{ {
writeLog(level, sourceFile, lineNum, msg, ex.stackTrace(), writeLog(level, sourceFile, lineNum, msg, ex.stackTrace().c_str());
level >= logLevel_ && fpp_,
stdoutField_&level);
} }
void Logger::log void Logger::log

View File

@ -56,9 +56,13 @@ public:
A2_ERROR = 1 << 4, A2_ERROR = 1 << 4,
}; };
private: private:
// Minimum log level for file log output.
LEVEL logLevel_; LEVEL logLevel_;
SharedHandle<OutputFile> fpp_; SharedHandle<OutputFile> fpp_;
int stdoutField_; // Minimum log level for console log output.
LEVEL consoleLogLevel_;
// true if console log output is enabled.
bool consoleOutput_;
bool useColor_; bool useColor_;
// Don't allow copying // Don't allow copying
Logger(const Logger&); Logger(const Logger&);
@ -69,9 +73,14 @@ private:
const char* sourceFile, const char* sourceFile,
int lineNum, int lineNum,
const char* msg, const char* msg,
const std::string& trace, const char* trace);
bool toStream,
bool toConsole); // Returns true if message with log level |level| will be outputted
// to file.
bool fileLogEnabled(LEVEL level);
// Returns true if message with log level |level| will be outputted
// to console.
bool consoleLogEnabled(LEVEL level);
public: public:
Logger(); Logger();
@ -112,7 +121,12 @@ public:
logLevel_ = level; logLevel_ = level;
} }
void setStdoutLogLevel(Logger::LEVEL level, bool enabled); void setConsoleLogLevel(LEVEL level)
{
consoleLogLevel_ = level;
}
void setConsoleOutput(bool enabled);
// Returns true if this logger actually writes debug log message to // Returns true if this logger actually writes debug log message to
// either file or stdout. // either file or stdout.

View File

@ -48,6 +48,8 @@ namespace aria2 {
std::vector<OptionHandler*> OptionHandlerFactory::createOptionHandlers() std::vector<OptionHandler*> OptionHandlerFactory::createOptionHandlers()
{ {
std::vector<OptionHandler*> handlers; std::vector<OptionHandler*> handlers;
static const std::string logLevels[] =
{ V_DEBUG, V_INFO, V_NOTICE, V_WARN, V_ERROR };
// General Options // General Options
{ {
OptionHandler* op(new BooleanOptionHandler OptionHandler* op(new BooleanOptionHandler
@ -213,6 +215,16 @@ std::vector<OptionHandler*> OptionHandlerFactory::createOptionHandlers()
op->addTag(TAG_ADVANCED); op->addTag(TAG_ADVANCED);
handlers.push_back(op); handlers.push_back(op);
} }
{
OptionHandler* op(new ParameterOptionHandler
(PREF_CONSOLE_LOG_LEVEL,
TEXT_CONSOLE_LOG_LEVEL,
V_NOTICE,
std::vector<std::string>
(vbegin(logLevels), vend(logLevels))));
op->addTag(TAG_ADVANCED);
handlers.push_back(op);
}
{ {
OptionHandler* op(new BooleanOptionHandler OptionHandler* op(new BooleanOptionHandler
(PREF_DEFERRED_INPUT, (PREF_DEFERRED_INPUT,
@ -472,13 +484,12 @@ std::vector<OptionHandler*> OptionHandlerFactory::createOptionHandlers()
handlers.push_back(op); handlers.push_back(op);
} }
{ {
const std::string params[] = { V_DEBUG, V_INFO, V_NOTICE, V_WARN, V_ERROR };
OptionHandler* op(new ParameterOptionHandler OptionHandler* op(new ParameterOptionHandler
(PREF_LOG_LEVEL, (PREF_LOG_LEVEL,
TEXT_LOG_LEVEL, TEXT_LOG_LEVEL,
V_DEBUG, V_DEBUG,
std::vector<std::string> std::vector<std::string>
(vbegin(params), vend(params)))); (vbegin(logLevels), vend(logLevels))));
op->addTag(TAG_ADVANCED); op->addTag(TAG_ADVANCED);
op->setChangeGlobalOption(true); op->setChangeGlobalOption(true);
handlers.push_back(op); handlers.push_back(op);

View File

@ -190,6 +190,7 @@ error_code::Value main(int argc, char* argv[])
#endif // ENABLE_BITTORRENT #endif // ENABLE_BITTORRENT
LogFactory::setLogFile(op->get(PREF_LOG)); LogFactory::setLogFile(op->get(PREF_LOG));
LogFactory::setLogLevel(op->get(PREF_LOG_LEVEL)); LogFactory::setLogLevel(op->get(PREF_LOG_LEVEL));
LogFactory::setConsoleLogLevel(op->get(PREF_CONSOLE_LOG_LEVEL));
if(op->getAsBool(PREF_QUIET)) { if(op->getAsBool(PREF_QUIET)) {
LogFactory::setConsoleOutput(false); LogFactory::setConsoleOutput(false);
} }

View File

@ -254,6 +254,8 @@ const Pref* PREF_ASYNC_DNS = makePref("async-dns");
const Pref* PREF_SUMMARY_INTERVAL = makePref("summary-interval"); const Pref* PREF_SUMMARY_INTERVAL = makePref("summary-interval");
// value: debug, info, notice, warn, error // value: debug, info, notice, warn, error
const Pref* PREF_LOG_LEVEL = makePref("log-level"); const Pref* PREF_LOG_LEVEL = makePref("log-level");
// value: debug, info, notice, warn, error
const Pref* PREF_CONSOLE_LOG_LEVEL = makePref("console-log-level");
// value: inorder | feedback | adaptive // value: inorder | feedback | adaptive
const Pref* PREF_URI_SELECTOR = makePref("uri-selector"); const Pref* PREF_URI_SELECTOR = makePref("uri-selector");
// value: 1*digit // value: 1*digit

View File

@ -189,6 +189,8 @@ extern const Pref* PREF_ASYNC_DNS;
extern const Pref* PREF_SUMMARY_INTERVAL; extern const Pref* PREF_SUMMARY_INTERVAL;
// value: debug, info, notice, warn, error // value: debug, info, notice, warn, error
extern const Pref* PREF_LOG_LEVEL; extern const Pref* PREF_LOG_LEVEL;
// value: debug, info, notice, warn, error
extern const Pref* PREF_CONSOLE_LOG_LEVEL;
// value: inorder | feedback | adaptive // value: inorder | feedback | adaptive
extern const Pref* PREF_URI_SELECTOR; extern const Pref* PREF_URI_SELECTOR;
// value: 1*digit // value: 1*digit

View File

@ -422,7 +422,8 @@
_(" --summary-interval=SEC Set interval to output download progress summary.\n" \ _(" --summary-interval=SEC Set interval to output download progress summary.\n" \
" Setting 0 suppresses the output.") " Setting 0 suppresses the output.")
#define TEXT_LOG_LEVEL \ #define TEXT_LOG_LEVEL \
_(" --log-level=LEVEL Set log level to output.") _(" --log-level=LEVEL Set log level to output to file specified using\n" \
" --log option.")
#define TEXT_REMOTE_TIME \ #define TEXT_REMOTE_TIME \
_(" -R, --remote-time[=true|false] Retrieve timestamp of the remote file from the\n" \ _(" -R, --remote-time[=true|false] Retrieve timestamp of the remote file from the\n" \
" remote HTTP/FTP server and if it is available,\n" \ " remote HTTP/FTP server and if it is available,\n" \
@ -939,3 +940,5 @@
" sessions saved using --save-session option. If\n" \ " sessions saved using --save-session option. If\n" \
" this option is not used, new GID is generated\n" \ " this option is not used, new GID is generated\n" \
" by aria2.") " by aria2.")
#define TEXT_CONSOLE_LOG_LEVEL \
_(" --console-log-level=LEVEL Set log level to output to console.")