summaryrefslogtreecommitdiff
path: root/src/Logger.h
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2009-07-18 08:30:37 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2009-07-18 08:30:37 +0000
commit21170e804d7a0e8a130c5e0df20fda91733c1a59 (patch)
tree6922f6c1cc1c5a316a2022fe7ae973eb3f0d814a /src/Logger.h
parente6422f82ebbe0f315bb03b174d56afeff30ddb90 (diff)
2009-07-18 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Rewritten Logger to avoiding constly virtual call. * src/LogFactory.cc * src/LogFactory.h * src/Logger.h * src/Makefile.am * src/Makefile.in * src/NullLogger.h: Removed. * src/SimpleLogger.cc * src/SimpleLogger.h
Diffstat (limited to 'src/Logger.h')
-rw-r--r--src/Logger.h149
1 files changed, 136 insertions, 13 deletions
diff --git a/src/Logger.h b/src/Logger.h
index 7119df59..fe141ffd 100644
--- a/src/Logger.h
+++ b/src/Logger.h
@@ -37,24 +37,17 @@
#include "common.h"
+#include <cstdarg>
+#include <string>
+#include <fstream>
+#include <iostream>
+
namespace aria2 {
class Exception;
class Logger {
public:
- virtual ~Logger() {}
- virtual void debug(const char* msg, ...) = 0;
- virtual void debug(const char* msg, const Exception& ex, ...) = 0;
- virtual void info(const char* msg, ...) = 0;
- virtual void info(const char* msg, const Exception& ex, ...) = 0;
- virtual void notice(const char* msg, ...) = 0;
- virtual void notice(const char* msg, const Exception& ex, ...) = 0;
- virtual void warn(const char* msg, ...) = 0;
- virtual void warn(const char* msg, const Exception& ex, ...) = 0;
- virtual void error(const char* msg, ...) = 0;
- virtual void error(const char* msg, const Exception& ex, ...) = 0;
-
enum LEVEL {
DEBUG = 1 << 0,
INFO = 1 << 1,
@@ -63,7 +56,137 @@ public:
ERROR = 1 << 4,
};
- virtual void setLogLevel(LEVEL level) = 0;
+ 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:
+ LEVEL _logLevel;
+
+ std::ofstream _file;
+
+ int _stdoutField;
+protected:
+ virtual void writeLog
+ (std::ostream& o, LEVEL logLevel, const std::string& logLevelLabel,
+ const char* msg, va_list ap) = 0;
+
+ virtual void writeStackTrace
+ (std::ostream& o, LEVEL logLevel, const std::string& logLevelLabel,
+ const Exception& ex) = 0;
+public:
+ Logger();
+
+ virtual ~Logger();
+
+#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 debug(const char* msg, ...)
+ {
+ WRITE_LOG(DEBUG, DEBUG_LABEL, msg);
+ }
+
+ void debug(const char* msg, const Exception& ex, ...)
+ {
+ WRITE_LOG_EX(DEBUG, DEBUG_LABEL, msg, ex);
+ }
+
+ void info(const char* msg, ...)
+ {
+ WRITE_LOG(INFO, INFO_LABEL, msg);
+ }
+
+ void info(const char* msg, const Exception& ex, ...)
+ {
+ WRITE_LOG_EX(INFO, INFO_LABEL, msg, ex);
+ }
+
+ void notice(const char* msg, ...)
+ {
+ WRITE_LOG(NOTICE, NOTICE_LABEL, msg);
+ }
+
+ void notice(const char* msg, const Exception& ex, ...)
+ {
+ WRITE_LOG_EX(NOTICE, NOTICE_LABEL, msg, ex);
+ }
+
+ void warn(const char* msg, ...)
+ {
+ WRITE_LOG(WARN, WARN_LABEL, msg);
+ }
+
+ void warn(const char* msg, const Exception& ex, ...)
+ {
+ WRITE_LOG_EX(WARN, WARN_LABEL, msg, ex);
+ }
+
+ void error(const char* msg, ...)
+ {
+ WRITE_LOG(ERROR, ERROR_LABEL, msg);
+ }
+
+ void error(const char* msg, const Exception& ex, ...)
+ {
+ WRITE_LOG_EX(ERROR, ERROR_LABEL, msg, ex);
+ }
+
+ void openFile(const std::string& filename);
+
+ void closeFile();
+
+ void setLogLevel(LEVEL level)
+ {
+ _logLevel = level;
+ }
+
+ void setStdoutLogLevel(Logger::LEVEL level, bool enabled)
+ {
+ if(enabled) {
+ _stdoutField |= level;
+ } else {
+ _stdoutField &= ~level;
+ }
+ }
};
} // namespace aria2