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_;
|
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() {
|
||||||
|
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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
|
||||||
|
|
24
src/Logger.h
24
src/Logger.h
|
@ -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.
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.")
|
||||||
|
|
Loading…
Reference in New Issue