/* */ #include "Logger.h" #include #include #include "DlAbortEx.h" #include "StringFormat.h" #include "message.h" namespace aria2 { const std::string Logger::DEBUG_LABEL("DEBUG"); const std::string Logger::NOTICE_LABEL("NOTICE"); const std::string Logger::WARN_LABEL("WARN"); const std::string Logger::ERROR_LABEL("ERROR"); const std::string Logger::INFO_LABEL("INFO"); Logger::Logger():logLevel_(Logger::A2_DEBUG), stdoutField_(0) {} Logger::~Logger() { closeFile(); } void Logger::openFile(const std::string& filename) { file_.open(filename.c_str(), std::ios::app|std::ios::binary); if(!file_) { throw DL_ABORT_EX (StringFormat(EX_FILE_OPEN, filename.c_str(), strerror(errno)).str()); } } void Logger::closeFile() { if(file_.is_open()) { file_.close(); } } #define WRITE_LOG(LEVEL, LEVEL_LABEL, MSG) \ if(LEVEL >= logLevel_ && file_.is_open()) { \ va_list ap; \ va_start(ap, MSG); \ writeLog(file_, LEVEL, LEVEL_LABEL, MSG, ap); \ va_end(ap); \ file_ << std::flush; \ } \ if(stdoutField_&LEVEL) { \ std::cout << "\n"; \ va_list ap; \ va_start(ap, MSG); \ writeLog(std::cout, LEVEL, LEVEL_LABEL, MSG, ap); \ va_end(ap); \ std::cout << std::flush; \ } \ #define WRITE_LOG_EX(LEVEL, LEVEL_LABEL, MSG, EX) \ if(LEVEL >= logLevel_ && file_.is_open()) { \ va_list ap; \ va_start(ap, EX); \ writeLog(file_, LEVEL, LEVEL_LABEL, MSG, ap); \ va_end(ap); \ writeStackTrace(file_, LEVEL, LEVEL_LABEL, EX); \ file_ << std::flush; \ } \ if(stdoutField_&LEVEL) { \ std::cout << "\n"; \ va_list ap; \ va_start(ap, EX); \ writeLog(std::cout, LEVEL, LEVEL_LABEL, MSG, ap); \ va_end(ap); \ writeStackTrace(std::cout, LEVEL, LEVEL_LABEL, EX); \ std::cout << std::flush; \ } \ void Logger::debug(const char* msg, ...) { WRITE_LOG(A2_DEBUG, DEBUG_LABEL, msg); } void Logger::debug(const char* msg, const Exception& ex, ...) { WRITE_LOG_EX(A2_DEBUG, DEBUG_LABEL, msg, ex); } void Logger::info(const char* msg, ...) { WRITE_LOG(A2_INFO, INFO_LABEL, msg); } void Logger::info(const char* msg, const Exception& ex, ...) { WRITE_LOG_EX(A2_INFO, INFO_LABEL, msg, ex); } void Logger::notice(const char* msg, ...) { WRITE_LOG(A2_NOTICE, NOTICE_LABEL, msg); } void Logger::notice(const char* msg, const Exception& ex, ...) { WRITE_LOG_EX(A2_NOTICE, NOTICE_LABEL, msg, ex); } void Logger::warn(const char* msg, ...) { WRITE_LOG(A2_WARN, WARN_LABEL, msg); } void Logger::warn(const char* msg, const Exception& ex, ...) { WRITE_LOG_EX(A2_WARN, WARN_LABEL, msg, ex); } void Logger::error(const char* msg, ...) { WRITE_LOG(A2_ERROR, ERROR_LABEL, msg); } void Logger::error(const char* msg, const Exception& ex, ...) { WRITE_LOG_EX(A2_ERROR, ERROR_LABEL, msg, ex); } void Logger::setStdoutLogLevel(Logger::LEVEL level, bool enabled) { if(enabled) { stdoutField_ |= level; } else { stdoutField_ &= ~level; } } } // namespace aria2