/* */ #ifndef _D_LOGGER_H_ #define _D_LOGGER_H_ #include "common.h" #include #include #include #include namespace aria2 { class Exception; class LogFormatter; class Logger { public: enum LEVEL { A2_DEBUG = 1 << 0, A2_INFO = 1 << 1, A2_NOTICE = 1 << 2, A2_WARN = 1 << 3, A2_ERROR = 1 << 4, }; static const std::string DEBUG_LABEL; static const std::string NOTICE_LABEL; static const std::string WARN_LABEL; static const std::string ERROR_LABEL; static const std::string INFO_LABEL; private: LogFormatter* logFormatter_; LEVEL logLevel_; std::ofstream file_; int stdoutField_; bool levelEnabled(LEVEL level) { return (level >= logLevel_ && file_.is_open()) || stdoutField_&level; } void writeLog (std::ostream& o, LEVEL logLevel, const std::string& logLevelLabel, const char* msg, va_list ap); void writeStackTrace (std::ostream& o, LEVEL logLevel, const std::string& logLevelLabel, const Exception& ex); public: Logger(); virtual ~Logger(); void debug(const char* msg, ...); void debug(const char* msg, const Exception& ex, ...); void info(const char* msg, ...); void info(const char* msg, const Exception& ex, ...); void notice(const char* msg, ...); void notice(const char* msg, const Exception& ex, ...); void warn(const char* msg, ...); void warn(const char* msg, const Exception& ex, ...); void error(const char* msg, ...); void error(const char* msg, const Exception& ex, ...); void openFile(const std::string& filename); void closeFile(); void setLogFormatter(LogFormatter* logFormatter); void setLogLevel(LEVEL level) { logLevel_ = level; } void setStdoutLogLevel(Logger::LEVEL level, bool enabled); // Returns true if this logger actually writes debug log message to // either file or stdout. bool debug() { return levelEnabled(A2_DEBUG); } bool info() { return levelEnabled(A2_INFO); } }; } // namespace aria2 #endif // _D_LOGGER_H_