wvlog.h

00001 /* -*- Mode: C++ -*-
00002  * Worldvisions Weaver Software:
00003  *   Copyright (C) 1997-2002 Net Integration Technologies, Inc.
00004  *
00005  * A generic data-logger class with support for multiple receivers.  If
00006  * no WvLogRcv objects have been created (see wvlogrcv.h) the default is
00007  * to log to stderr.
00008  * 
00009  * WvLog supports partial- and multiple-line log messages.  For example,
00010  *        log.print("test ");
00011  *        log.print("string\nfoo");
00012  * will print:
00013  *        appname(lvl): test string
00014  *        appname(lvl): foo
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 // a WvLogRcv registers itself with WvLog and prints, captures,
00028 // or transmits log messages.
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 
00055 class WvLog : public WvStream
00056 {
00057     friend class WvLogRcvBase;
00058 public:
00059     enum LogLevel {
00060         Critical = 0,
00061         Error,
00062         Warning,
00063         Notice,
00064         Info,
00065         Debug, Debug1=Debug,
00066         Debug2,
00067         Debug3,
00068         Debug4,
00069         Debug5,
00070         
00071         NUM_LOGLEVELS
00072     };
00073     WvString app;
00074 
00075 protected:
00076     LogLevel loglevel;
00077     static WvLogRcvBaseList receivers;
00078     static int num_receivers, num_logs;
00079     static WvLogRcvBase *default_receiver;
00080 
00081 public:
00082     WvLog(WvStringParm _app, LogLevel _loglevel = Info);
00083     WvLog(const WvLog &l);
00084     virtual ~WvLog();
00085     
00087     virtual bool isok() const;
00088     
00089     /* always writable */
00090     virtual bool pre_select(SelectInfo &si);
00091 
00096     WvLog &lvl(LogLevel _loglevel)
00097         { loglevel = _loglevel; return *this; }
00098     
00100     size_t operator() (LogLevel _loglevel, WvStringParm s)
00101     { 
00102         LogLevel l = loglevel; 
00103         size_t x = lvl(_loglevel).write(s);
00104         lvl(l);
00105         return x;
00106     }
00107     
00109     size_t operator() (LogLevel _loglevel, WVSTRING_FORMAT_DECL)
00110     { 
00111         LogLevel l = loglevel;
00112         size_t x = lvl(_loglevel).print(WVSTRING_FORMAT_CALL);
00113         lvl(l);
00114         return x;
00115     }
00116     
00121     size_t operator() (WvStringParm s)
00122         { return WvStream::operator()(s); }
00123     size_t operator() (WVSTRING_FORMAT_DECL)
00124         { return WvStream::operator()(WVSTRING_FORMAT_CALL); }
00125     
00131     WvLog split(LogLevel _loglevel) const
00132         { return WvLog(app, _loglevel); }
00133     
00138     virtual size_t uwrite(const void *buf, size_t len);
00139     
00141     void perror(WvStringParm s)
00142         { print("%s: %s\n", s, strerror(errno)); }
00143 };
00144 
00145 
00146 #endif // __WVLOG_H

Generated on Thu May 25 21:51:03 2006 for WvStreams by  doxygen 1.4.6