00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef MDWLOGGER_H
00021 #define MDWLOGGER_H
00022
00023 #include <string>
00024 #include "Stream.h"
00025
00026 namespace mdw
00027 {
00028
00032 class Logger
00033 {
00034 public:
00035 typedef enum
00036 {
00037 Fatal_e, Error_e, Warn_e, Info_e, Debug_e
00038 } LogType_t;
00039
00040 class LevelWrap
00041 {
00042 public:
00043 LevelWrap (int l) : level (l) {}
00044 int level;
00045 };
00046 class LineWrap
00047 {
00048 public:
00049 LineWrap (int l) : line (l) {}
00050 int line;
00051 };
00052 class FileWrap
00053 {
00054 public:
00055 FileWrap (const char * f) : file (f) {}
00056 const char * file;
00057 };
00058
00059 class LogStream : public Stream
00060 {
00061 public:
00062 virtual void output (const char * buff, int size)
00063 {
00064 _logger.log (_logType, buff, size, _level, false, _file, _line);
00065 }
00066 LogStream & operator<< (LogType_t type)
00067 {
00068 _logType = type;
00069 return *this;
00070 }
00071 LogStream & operator<< (LevelWrap level)
00072 {
00073 _level = level.level;
00074 return *this;
00075 }
00076 LogStream & operator<< (LineWrap line)
00077 {
00078 _line = line.line;
00079 return *this;
00080 }
00081 Stream & operator<< (FileWrap file)
00082 {
00083 _file = file.file;
00084 return *this;
00085 }
00086 LogStream & operator<< (Endl e)
00087 {
00088 _logger.log (_logType, "", 0, _level, true, _file, _line);
00089 return *this;
00090 }
00091 friend class Logger;
00092 private:
00093 LogStream (Logger &l) : _logger (l) {}
00094 int _level;
00095 LogType_t _logType;
00096 Logger &_logger;
00097 int _line;
00098 const char * _file;
00099 };
00100
00101 static void initialise (Stream &s);
00102 static Logger &getInstance();
00103 void setDebugMode (const std::string &className, bool active, int level);
00104 void log (LogType_t type, const std::string &message, int level, bool end, const char* file, int line);
00105 void log (LogType_t type, const char * buff, int size, int level, bool end, const char* file, int line);
00106 LogStream &getStreamInt();
00107 Stream &getStream();
00108 Logger (Stream &s);
00109 ~Logger();
00110 private:
00111
00112 Stream &_underlyer;
00113 void init();
00114 void logStart (LogType_t, const char* file, int line);
00115 static Logger *_instance;
00116 LogStream _stream;
00117 bool _start;
00118 };
00119
00120 }
00121
00122 #define LOG_LEVEL(a, l, t){mdw::Logger::getInstance().getStreamInt() << mdw::Logger::l << mdw::Logger::LevelWrap(t) << \
00123 mdw::Logger::LineWrap(__LINE__) << mdw::Logger::FileWrap(__FILE__) << a << mdw::endl; }
00124 #define LOG_FATAL(a) LOG_LEVEL(a, Fatal_e, 0)
00125 #define LOG_ERROR(a) LOG_LEVEL(a, Error_e, 0)
00126 #define LOG_ERRNO(a, e){char buff[1024]; strerror_r(e, buff, 1024); mdw::Logger::getInstance().getStreamInt() \
00127 << mdw::Logger::Error_e << mdw::Logger::LevelWrap(0) << mdw::Logger::LineWrap(__LINE__) << mdw::Logger::FileWrap(__FILE__) \
00128 << a << " - Errno is " << buff << mdw::endl; }
00129 #define LOG_WARN(a) LOG_LEVEL(a, Warn_e, 0)
00130 #define LOG_INFO(a) LOG_LEVEL(a, Info_e, 0)
00131 #define LOG_DEBUG(a,t) LOG_LEVEL(a, Debug_e, t)
00132
00133 #endif