mirror of https://github.com/aria2/aria2
Added --console-log-level option
--console-log-level option sets log level to output to console.pull/43/head
parent
f019eae5df
commit
d6000024c0
|
@ -43,6 +43,7 @@ std::string LogFactory::filename_ = DEV_NULL;
|
|||
SharedHandle<Logger> LogFactory::logger_;
|
||||
bool LogFactory::consoleOutput_ = true;
|
||||
Logger::LEVEL LogFactory::logLevel_ = Logger::A2_DEBUG;
|
||||
Logger::LEVEL LogFactory::consoleLogLevel_ = Logger::A2_NOTICE;
|
||||
|
||||
void LogFactory::openLogger(const SharedHandle<Logger>& logger)
|
||||
{
|
||||
|
@ -52,6 +53,8 @@ void LogFactory::openLogger(const SharedHandle<Logger>& logger)
|
|||
logger->openFile(filename_);
|
||||
}
|
||||
logger->setLogLevel(logLevel_);
|
||||
logger->setConsoleLogLevel(consoleLogLevel_);
|
||||
logger->setConsoleOutput(consoleOutput_);
|
||||
}
|
||||
|
||||
void LogFactory::reconfigure()
|
||||
|
@ -72,11 +75,6 @@ const SharedHandle<Logger>& LogFactory::getInstance()
|
|||
if(!logger_) {
|
||||
SharedHandle<Logger> slogger(new Logger());
|
||||
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);
|
||||
}
|
||||
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)
|
||||
{
|
||||
logLevel_ = level;
|
||||
|
@ -100,17 +117,17 @@ void LogFactory::setLogLevel(Logger::LEVEL level)
|
|||
|
||||
void LogFactory::setLogLevel(const std::string& level)
|
||||
{
|
||||
if(level == V_DEBUG) {
|
||||
logLevel_ = Logger::A2_DEBUG;
|
||||
} else if(level == V_INFO) {
|
||||
logLevel_ = Logger::A2_INFO;
|
||||
} else if(level == V_NOTICE) {
|
||||
logLevel_ = Logger::A2_NOTICE;
|
||||
} else if(level == V_WARN) {
|
||||
logLevel_ = Logger::A2_WARN;
|
||||
} else if(level == V_ERROR) {
|
||||
logLevel_ = Logger::A2_ERROR;
|
||||
}
|
||||
logLevel_ = toLogLevel(level);
|
||||
}
|
||||
|
||||
void LogFactory::setConsoleLogLevel(Logger::LEVEL level)
|
||||
{
|
||||
consoleLogLevel_ = level;
|
||||
}
|
||||
|
||||
void LogFactory::setConsoleLogLevel(const std::string& level)
|
||||
{
|
||||
consoleLogLevel_ = toLogLevel(level);
|
||||
}
|
||||
|
||||
void LogFactory::release() {
|
||||
|
|
|
@ -50,6 +50,7 @@ private:
|
|||
static SharedHandle<Logger> logger_;
|
||||
static bool consoleOutput_;
|
||||
static Logger::LEVEL logLevel_;
|
||||
static Logger::LEVEL consoleLogLevel_;
|
||||
|
||||
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);
|
||||
|
||||
/**
|
||||
* Set log level to output by string represention of log level.
|
||||
* Possible values are: debug, info, notice, warn, error
|
||||
* Set log level to output to file by string represention of log
|
||||
* level. Possible values are: debug, info, notice, warn, error
|
||||
*/
|
||||
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
|
||||
*/
|
||||
|
|
|
@ -51,7 +51,8 @@ namespace aria2 {
|
|||
|
||||
Logger::Logger()
|
||||
: logLevel_(Logger::A2_DEBUG),
|
||||
stdoutField_(0),
|
||||
consoleLogLevel_(Logger::A2_NOTICE),
|
||||
consoleOutput_(true),
|
||||
#ifdef __MINGW32__
|
||||
// Windows DOS prompt does not handle ANSI color code, so make
|
||||
// this false.
|
||||
|
@ -85,18 +86,24 @@ void Logger::closeFile()
|
|||
}
|
||||
}
|
||||
|
||||
void Logger::setStdoutLogLevel(Logger::LEVEL level, bool enabled)
|
||||
void Logger::setConsoleOutput(bool enabled)
|
||||
{
|
||||
if(enabled) {
|
||||
stdoutField_ |= level;
|
||||
} else {
|
||||
stdoutField_ &= ~level;
|
||||
}
|
||||
consoleOutput_ = enabled;
|
||||
}
|
||||
|
||||
bool Logger::fileLogEnabled(LEVEL level)
|
||||
{
|
||||
return level >= logLevel_ && fpp_;
|
||||
}
|
||||
|
||||
bool Logger::consoleLogEnabled(LEVEL level)
|
||||
{
|
||||
return consoleOutput_ && level >= consoleLogLevel_;
|
||||
}
|
||||
|
||||
bool Logger::levelEnabled(LEVEL level)
|
||||
{
|
||||
return (level >= logLevel_ && fpp_) || stdoutField_&level;
|
||||
return fileLogEnabled(level) || consoleLogEnabled(level);
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
@ -144,9 +151,9 @@ const char* levelColor(Logger::LEVEL level)
|
|||
{
|
||||
switch(level) {
|
||||
case Logger::A2_DEBUG:
|
||||
return "\033[1;37m";
|
||||
case Logger::A2_INFO:
|
||||
// We don't print these levels in console
|
||||
return "";
|
||||
return "\033[1;36m";
|
||||
case Logger::A2_NOTICE:
|
||||
return "\033[1;32m";
|
||||
case Logger::A2_WARN:
|
||||
|
@ -173,9 +180,9 @@ void writeHeaderConsole(Output& fp, Logger::LEVEL level, bool useColor)
|
|||
|
||||
namespace {
|
||||
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
|
||||
|
||||
|
@ -184,17 +191,15 @@ void Logger::writeLog
|
|||
const char* sourceFile,
|
||||
int lineNum,
|
||||
const char* msg,
|
||||
const std::string& trace,
|
||||
bool toStream,
|
||||
bool toConsole)
|
||||
const char* trace)
|
||||
{
|
||||
if(toStream) {
|
||||
if(fileLogEnabled(level)) {
|
||||
writeHeader(*fpp_, level, sourceFile, lineNum);
|
||||
fpp_->printf("%s\n", msg);
|
||||
writeStackTrace(*fpp_, trace);
|
||||
fpp_->flush();
|
||||
}
|
||||
if(toConsole) {
|
||||
if(consoleLogEnabled(level)) {
|
||||
global::cout()->printf("\n");
|
||||
writeHeaderConsole(*global::cout(), level, useColor_);
|
||||
global::cout()->printf("%s\n", msg);
|
||||
|
@ -209,9 +214,7 @@ void Logger::log
|
|||
int lineNum,
|
||||
const char* msg)
|
||||
{
|
||||
writeLog(level, sourceFile, lineNum, msg, A2STR::NIL,
|
||||
level >= logLevel_ && fpp_,
|
||||
stdoutField_&level);
|
||||
writeLog(level, sourceFile, lineNum, msg, "");
|
||||
}
|
||||
|
||||
void Logger::log
|
||||
|
@ -230,9 +233,7 @@ void Logger::log
|
|||
const char* msg,
|
||||
const Exception& ex)
|
||||
{
|
||||
writeLog(level, sourceFile, lineNum, msg, ex.stackTrace(),
|
||||
level >= logLevel_ && fpp_,
|
||||
stdoutField_&level);
|
||||
writeLog(level, sourceFile, lineNum, msg, ex.stackTrace().c_str());
|
||||
}
|
||||
|
||||
void Logger::log
|
||||
|
|
24
src/Logger.h
24
src/Logger.h
|
@ -56,9 +56,13 @@ public:
|
|||
A2_ERROR = 1 << 4,
|
||||
};
|
||||
private:
|
||||
// Minimum log level for file log output.
|
||||
LEVEL logLevel_;
|
||||
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_;
|
||||
// Don't allow copying
|
||||
Logger(const Logger&);
|
||||
|
@ -69,9 +73,14 @@ private:
|
|||
const char* sourceFile,
|
||||
int lineNum,
|
||||
const char* msg,
|
||||
const std::string& trace,
|
||||
bool toStream,
|
||||
bool toConsole);
|
||||
const char* trace);
|
||||
|
||||
// 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:
|
||||
Logger();
|
||||
|
||||
|
@ -112,7 +121,12 @@ public:
|
|||
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
|
||||
// either file or stdout.
|
||||
|
|
|
@ -48,6 +48,8 @@ namespace aria2 {
|
|||
std::vector<OptionHandler*> OptionHandlerFactory::createOptionHandlers()
|
||||
{
|
||||
std::vector<OptionHandler*> handlers;
|
||||
static const std::string logLevels[] =
|
||||
{ V_DEBUG, V_INFO, V_NOTICE, V_WARN, V_ERROR };
|
||||
// General Options
|
||||
{
|
||||
OptionHandler* op(new BooleanOptionHandler
|
||||
|
@ -213,6 +215,16 @@ std::vector<OptionHandler*> OptionHandlerFactory::createOptionHandlers()
|
|||
op->addTag(TAG_ADVANCED);
|
||||
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
|
||||
(PREF_DEFERRED_INPUT,
|
||||
|
@ -472,13 +484,12 @@ std::vector<OptionHandler*> OptionHandlerFactory::createOptionHandlers()
|
|||
handlers.push_back(op);
|
||||
}
|
||||
{
|
||||
const std::string params[] = { V_DEBUG, V_INFO, V_NOTICE, V_WARN, V_ERROR };
|
||||
OptionHandler* op(new ParameterOptionHandler
|
||||
(PREF_LOG_LEVEL,
|
||||
TEXT_LOG_LEVEL,
|
||||
V_DEBUG,
|
||||
std::vector<std::string>
|
||||
(vbegin(params), vend(params))));
|
||||
(vbegin(logLevels), vend(logLevels))));
|
||||
op->addTag(TAG_ADVANCED);
|
||||
op->setChangeGlobalOption(true);
|
||||
handlers.push_back(op);
|
||||
|
|
|
@ -190,6 +190,7 @@ error_code::Value main(int argc, char* argv[])
|
|||
#endif // ENABLE_BITTORRENT
|
||||
LogFactory::setLogFile(op->get(PREF_LOG));
|
||||
LogFactory::setLogLevel(op->get(PREF_LOG_LEVEL));
|
||||
LogFactory::setConsoleLogLevel(op->get(PREF_CONSOLE_LOG_LEVEL));
|
||||
if(op->getAsBool(PREF_QUIET)) {
|
||||
LogFactory::setConsoleOutput(false);
|
||||
}
|
||||
|
|
|
@ -254,6 +254,8 @@ const Pref* PREF_ASYNC_DNS = makePref("async-dns");
|
|||
const Pref* PREF_SUMMARY_INTERVAL = makePref("summary-interval");
|
||||
// value: debug, info, notice, warn, error
|
||||
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
|
||||
const Pref* PREF_URI_SELECTOR = makePref("uri-selector");
|
||||
// value: 1*digit
|
||||
|
|
|
@ -189,6 +189,8 @@ extern const Pref* PREF_ASYNC_DNS;
|
|||
extern const Pref* PREF_SUMMARY_INTERVAL;
|
||||
// value: debug, info, notice, warn, error
|
||||
extern const Pref* PREF_LOG_LEVEL;
|
||||
// value: debug, info, notice, warn, error
|
||||
extern const Pref* PREF_CONSOLE_LOG_LEVEL;
|
||||
// value: inorder | feedback | adaptive
|
||||
extern const Pref* PREF_URI_SELECTOR;
|
||||
// value: 1*digit
|
||||
|
|
|
@ -422,7 +422,8 @@
|
|||
_(" --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.")
|
||||
_(" --log-level=LEVEL Set log level to output to file specified using\n" \
|
||||
" --log option.")
|
||||
#define TEXT_REMOTE_TIME \
|
||||
_(" -R, --remote-time[=true|false] Retrieve timestamp of the remote file from the\n" \
|
||||
" remote HTTP/FTP server and if it is available,\n" \
|
||||
|
@ -939,3 +940,5 @@
|
|||
" sessions saved using --save-session option. If\n" \
|
||||
" this option is not used, new GID is generated\n" \
|
||||
" by aria2.")
|
||||
#define TEXT_CONSOLE_LOG_LEVEL \
|
||||
_(" --console-log-level=LEVEL Set log level to output to console.")
|
||||
|
|
Loading…
Reference in New Issue