00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef __WVLOG_H
00017 #define __WVLOG_H
00018
00019 #include "wvstream.h"
00020 #include <errno.h>
00021 #ifdef _WIN32
00022 typedef int pid_t;
00023 #endif
00024
00025 class WvLog;
00026
00027
00028
00029 class WvLogRcvBase
00030 {
00031 friend class WvLog;
00032 protected:
00033 const char *appname(WvStringParm log) const;
00034 virtual void log(WvStringParm source, int loglevel,
00035 const char *_buf, size_t len) = 0;
00036
00037 private:
00038 static void cleanup_on_fork(pid_t p);
00039 static void static_init();
00040
00041 public:
00042 bool force_new_line;
00043 WvLogRcvBase();
00044 virtual ~WvLogRcvBase();
00045 };
00046
00047
00048 DeclareWvList(WvLogRcvBase);
00049
00050 typedef WvCallback<WvString, WvStringParm> WvLogFilter;
00051
00056 class WvLog : public WvStream
00057 {
00058 friend class WvLogRcvBase;
00059 public:
00060 enum LogLevel {
00061 Critical = 0,
00062 Error,
00063 Warning,
00064 Notice,
00065 Info,
00066 Debug, Debug1=Debug,
00067 Debug2,
00068 Debug3,
00069 Debug4,
00070 Debug5,
00071
00072 NUM_LOGLEVELS
00073 };
00074 WvString app;
00075
00076 protected:
00077 LogLevel loglevel;
00078 static WvLogRcvBaseList receivers;
00079 static int num_receivers, num_logs;
00080 static WvLogRcvBase *default_receiver;
00081 WvLogFilter* filter;
00082
00083 public:
00084 WvLog(WvStringParm _app, LogLevel _loglevel = Info,
00085 WvLogFilter* filter = 0);
00086 WvLog(const WvLog &l);
00087 virtual ~WvLog();
00088
00090 virtual bool isok() const;
00091
00092
00093 virtual bool pre_select(SelectInfo &si);
00094
00099 WvLog &lvl(LogLevel _loglevel)
00100 { loglevel = _loglevel; return *this; }
00101
00103 size_t operator() (LogLevel _loglevel, WvStringParm s)
00104 {
00105 LogLevel l = loglevel;
00106 size_t x = lvl(_loglevel).write(filter ? (*filter)(s) : s);
00107 lvl(l);
00108 return x;
00109 }
00110
00112 size_t operator() (LogLevel _loglevel, WVSTRING_FORMAT_DECL)
00113 {
00114 LogLevel l = loglevel;
00115 size_t x;
00116 if (filter)
00117 x = lvl(_loglevel).print((*filter)(WvString(WVSTRING_FORMAT_CALL)));
00118 else
00119 x = lvl(_loglevel).print(WVSTRING_FORMAT_CALL);
00120 lvl(l);
00121 return x;
00122 }
00123
00128 size_t operator() (WvStringParm s)
00129 { return WvStream::operator()(filter ? (*filter)(s) : s); }
00130 size_t operator() (WVSTRING_FORMAT_DECL)
00131 { return (filter ?
00132 WvStream::operator()((*filter)(WvString(WVSTRING_FORMAT_CALL))) :
00133 WvStream::operator()(WVSTRING_FORMAT_CALL) );
00134 }
00135
00141 WvLog split(LogLevel _loglevel) const
00142 { return WvLog(app, _loglevel, filter); }
00143
00148 virtual size_t uwrite(const void *buf, size_t len);
00149
00151 void perror(WvStringParm s)
00152 { print("%s: %s\n", s, strerror(errno)); }
00153
00154 public:
00155 const char *wstype() const { return "WvLog"; }
00156 };
00157
00158
00159 #endif // __WVLOG_H