00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef log_h
00024 #define log_h
00025
00026 #ifndef _REENTRANT
00027 #define _REENTRANT
00028 #endif
00029
00030 #include "config.h"
00031 #include "base.h"
00032 #include "util.h"
00033
00034 using std::ostream;
00035
00036 namespace karoo {
00037
00038 enum log_level {
00039 LOG_LEVEL_LOW_DEBUG = 0,
00040 LOG_LEVEL_DEBUG,
00041 LOG_LEVEL_INFO,
00042 LOG_LEVEL_WARNING,
00043 LOG_LEVEL_ERROR,
00044 LOG_LEVEL_FATAL
00045 };
00046
00047 class log_output: public referable
00048 {
00049 private:
00050 protected:
00051 enum log_level level;
00052 text name;
00053 void message(const text& msg, enum log_level level);
00054 karoo_mutex sem;
00055 public:
00056 log_output(enum log_level level = LOG_LEVEL_WARNING);
00057 virtual ~log_output();
00058
00059 void setName(const char* name);
00060 void setName(const text& name);
00061 void setLevel(enum log_level level);
00062
00063 void low_debug(const text& msg);
00064 void debug(const text& msg);
00065 void info(const text& msg);
00066 void warning(const text& msg);
00067 void error(const text& msg);
00068 void fatal(const text& msg);
00069
00070 operator enum log_level() const { return level; }
00071 };
00072
00073 class logstream;
00074
00075 class log
00076 {
00077 private:
00078 protected:
00079 mutable karoo_mutex sem;
00080 mutable log_output* logger;
00081 public:
00082 log();
00083 log(enum log_level level);
00084 log(const log& ref);
00085 log(log_output* r);
00086 virtual ~log();
00087
00088 void setName(const char* name);
00089 void setName(const text& name);
00090
00091 void setLevel(enum log_level level);
00092
00093 void debug(const text& msg);
00094 void info(const text& msg);
00095 void warning(const text& msg);
00096 void error(const text& msg);
00097 void fatal(const text& msg);
00098
00099 const log& operator=(const log& ref);
00100 const log& operator=(log_output* r);
00101
00102 operator bool() const;
00103 operator enum log_level() const;
00104 operator logstream() const;
00105
00106 logstream* new_logstream() const;
00107 };
00108
00109 class logstream
00110 {
00111 private:
00112 protected:
00113 mutable karoo_mutex sem;
00114 mutable log_output* logger;
00115 char* buf;
00116 size_t buf_pos;
00117 size_t buf_size;
00118 enum log_level buf_level;
00119 void appendBuf(const char* str);
00120 void appendBuf(char c);
00121 void resizeBuf(size_t sz);
00122 public:
00123 logstream(log_output* logger);
00124 logstream(const logstream& ref);
00125 logstream& operator=(const logstream& ref);
00126 virtual ~logstream();
00127
00128 logstream& operator<<(const enum log_level val);
00129 logstream& operator<<(bool val);
00130 logstream& operator<<(short val);
00131 logstream& operator<<(unsigned short val);
00132 logstream& operator<<(int val);
00133 logstream& operator<<(unsigned int val);
00134 logstream& operator<<(long val);
00135 logstream& operator<<(unsigned long val);
00136 logstream& operator<<(long long val);
00137 logstream& operator<<(unsigned long long val);
00138 logstream& operator<<(float val);
00139 logstream& operator<<(double val);
00140 logstream& operator<<(long double val);
00141
00142 logstream& operator<<(char c);
00143 logstream& operator<<(unsigned char c);
00144
00145 logstream& operator<<(const char* s);
00146 logstream& operator<<(const unsigned char* s);
00147 logstream& operator<<(const text& s);
00148
00149 logstream& flush();
00150 };
00151
00152 }
00153
00154 #endif