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
00022
class WvLog;
00023
00024
00025
00026 class WvLogRcvBase
00027 {
00028
friend class WvLog;
00029
protected:
00030
const char *
appname(
const WvLog *
log)
const;
00031
virtual void log(
const WvLog *source,
int loglevel,
00032
const char *_buf, size_t len) = 0;
00033
public:
00034
WvLogRcvBase();
00035
virtual ~WvLogRcvBase();
00036 };
00037
00038
00039
DeclareWvList(
WvLogRcvBase);
00040
00041
00042
00043
00044
00045
00046 class WvLog :
public WvStream
00047 {
00048
friend class WvLogRcvBase;
00049
public:
00050 enum LogLevel {
00051
Critical = 0,
00052
Error,
00053
Warning,
00054
Notice,
00055
Info,
00056
Debug,
Debug1=Debug,
00057
Debug2,
00058
Debug3,
00059
Debug4,
00060
Debug5,
00061
00062
NUM_LOGLEVELS
00063 };
00064 WvString app;
00065
00066
protected:
00067 const WvLog *
parent;
00068 LogLevel loglevel;
00069
static WvLogRcvBaseList
receivers;
00070 static int num_receivers,
num_logs;
00071
static WvLogRcvBase *
default_receiver;
00072
00073
public:
00074
WvLog(
WvStringParm _app, LogLevel _loglevel = Info,
00075
const WvLog *par = NULL);
00076
WvLog(
const WvLog &l);
00077
virtual ~WvLog();
00078
00079
00080
virtual bool isok() const;
00081
00082
00083 virtual
bool pre_select(SelectInfo &si);
00084
00085
00086
00087
00088
00089 WvLog &lvl(LogLevel _loglevel)
00090 {
loglevel = _loglevel;
return *
this; }
00091
00092
00093 size_t operator() (LogLevel _loglevel,
WvStringParm s)
00094 {
00095
LogLevel l =
loglevel;
00096 size_t x =
lvl(_loglevel).
write(s);
00097 lvl(l);
00098
return x;
00099 }
00100
00101
00102 size_t operator() (LogLevel _loglevel, WVSTRING_FORMAT_DECL)
00103 {
00104
LogLevel l =
loglevel;
00105 size_t x =
lvl(_loglevel).
print(
WVSTRING_FORMAT_CALL);
00106 lvl(l);
00107
return x;
00108 }
00109
00110
00111
00112
00113
00114 size_t operator() (
WvStringParm s)
00115 {
return WvStream::operator()(s); }
00116 size_t operator() (WVSTRING_FORMAT_DECL)
00117 {
return WvStream::operator()(
WVSTRING_FORMAT_CALL); }
00118
00119
00120
00121
00122
00123
00124 WvLog split(LogLevel _loglevel)
const
00125
{
return WvLog(
app, _loglevel,
this); }
00126
00127
00128
00129
00130
00131
virtual size_t uwrite(
const void *buf, size_t len);
00132
00133
00134 void perror(
WvStringParm s)
00135 { print(
"%s: %s\n", s, strerror(errno)); }
00136 };
00137
00138
00139
#endif // __WVLOG_H