00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 #ifndef ERRLOG_H
00031 #define ERRLOG_H
00032 
00033 #include "w_defines.h"
00034 
00035 
00036 
00037 
00038 
00039 #include <cassert>
00040 #include <cstdlib>
00041 #include <cstddef>
00042 #include <w.h>
00043 #include <iostream>
00044 #include <cstdio>    
00045 #include <w_pthread.h> 
00046 
00047 #ifdef __GNUG__
00048 #pragma interface
00049 #endif
00050 
00051 class ErrLog; 
00052 class logstream; 
00053 
00054 #ifndef    _SYSLOG_H
00055 #define LOG_EMERG 0 
00056 #define LOG_ALERT 1
00057 #define LOG_CRIT  2
00058 #define LOG_ERR   3
00059 #define LOG_WARNING 4
00060 #define LOG_NOTICE  5
00061 #define LOG_INFO  6
00062 #define LOG_DEBUG 7
00063 #define LOG_USER  8
00064 #endif
00065 
00066 
00067 
00068 namespace shore_errlog {
00069 using namespace std;
00070 
00071 
00072 
00073 
00074 
00075 
00076 
00077 
00078 
00079 
00080 
00081 
00082 enum LogPriority {
00083     log_none = -1,    
00084     log_emerg = LOG_EMERG,        
00085     log_fatal = LOG_ALERT,        
00086     log_alert = log_fatal,        
00087     log_internal = LOG_CRIT,    
00088     log_error = LOG_ERR,        
00089     log_warning = LOG_WARNING,    
00090     log_info = LOG_INFO,        
00091     log_debug=LOG_DEBUG,        
00092     log_all,
00093     default_prio = log_error
00094 };
00095 
00096 } 
00097 
00098 using namespace shore_errlog;
00099 
00100 extern ostream& flushl(ostream& o);
00101 extern ostream& emerg_prio(ostream& o);
00102 extern ostream& fatal_prio(ostream& o);
00103 extern ostream& internal_prio(ostream& o);
00104 extern ostream& error_prio(ostream& o);
00105 extern ostream& warning_prio(ostream& o);
00106 extern ostream& info_prio(ostream& o);
00107 extern ostream& debug_prio(ostream& o);
00108 extern void setprio(ostream&, LogPriority);
00109 extern logstream *is_logstream(std::basic_ostream<char, std::char_traits<char > > &);
00110 
00111 
00112 
00113 
00114 
00115 
00116 
00117 
00118 
00119 
00120 
00121 class logstream : public w_ostrstream {
00122     friend class ErrLog;
00123     friend ostream &flush_and_setprio(ostream& o, LogPriority p);
00124     friend ostream& emerg_prio(ostream& o);
00125     friend ostream& fatal_prio(ostream& o);
00126     friend ostream& internal_prio(ostream& o);
00127     friend ostream& error_prio(ostream& o);
00128     friend ostream& warning_prio(ostream& o);
00129     friend ostream& info_prio(ostream& o);
00130     friend ostream& debug_prio(ostream& o);
00131 
00132     unsigned int     __magic1;
00133     LogPriority     _prio;
00134     ErrLog*        _log;
00135     unsigned int     __magic2;
00136 
00137 public:
00138 
00139  friend logstream *is_logstream(std::basic_ostream<char, std::char_traits<char > > &);
00140 
00141     enum { LOGSTREAM__MAGIC = 0xad12bc45 };
00142 private:
00143 public:
00144     logstream(char *buf, size_t bufsize = 1000)
00145     : w_ostrstream(buf, bufsize),
00146       __magic1(LOGSTREAM__MAGIC),
00147       _prio(log_none), 
00148       __magic2(LOGSTREAM__MAGIC)
00149         {
00150             
00151             assert(__magic1==LOGSTREAM__MAGIC);
00152         }
00153 
00154 protected:
00155     void  init_errlog(ErrLog* mine) { _log = mine; }
00156 
00157 
00158 };
00159 
00160 
00161 
00162 
00163 enum LoggingDestination {
00164     log_to_ether, 
00165     log_to_unix_file, 
00166     log_to_open_file, 
00167     log_to_stderr  
00168 }; 
00169 
00170 typedef void (*ErrLogFunc)(ErrLog *, void *);
00171 
00172 
00173 
00174 
00175 
00176 
00177 
00178 
00179 
00180 
00181 
00182 
00183 
00184 
00185 
00186 
00187 
00188 
00189 
00190 class ErrLog {
00191     friend class logstream;
00192     friend logstream *is_logstream(std::basic_ostream<char, std::char_traits<char > > &);
00193     friend ostream &flush_and_setprio(ostream& o, LogPriority p);
00194 
00195     LoggingDestination _destination;
00196     LogPriority       _level;
00197     FILE*             _file;        
00198     const char *      _ident; 
00199     char *            _buffer; 
00200     size_t            _bufsize; 
00201     unsigned int      _magic;
00202     pthread_mutex_t*  _errlog_mutex;
00203 
00204     enum { ERRORLOG__MAGIC = 0xa2d29754 };
00205 
00206 public:
00207 
00208 
00209 
00210 
00211 
00212 
00213 
00214 
00215 
00216 
00217 
00218     ErrLog(
00219         const char *ident,
00220         LoggingDestination dest, 
00221         const char *filename = 0,             
00222         LogPriority level =  default_prio,
00223         char *ownbuf = 0,
00224         int  ownbufsz = 0  
00225     );
00226 
00227 
00228 
00229 
00230 
00231 
00232 
00233 
00234 
00235     ErrLog(
00236         const char *ident,
00237         LoggingDestination dest, 
00238         FILE *file = 0,             
00239         LogPriority level =  default_prio,
00240         char *ownbuf = 0,
00241         int  ownbufsz = 0  
00242     );
00243 
00244     ~ErrLog();
00245 
00246 
00247 
00248 
00249 
00250     static LogPriority parse(const char *arg, bool *ok=0);
00251 
00252 
00253 
00254 
00255 
00256 
00257 
00258 
00259     logstream    clog;
00260 
00261 
00262 
00263 
00264 
00265     void log(enum LogPriority prio, const char *format, ...);
00266 
00267 
00268     const char * ident() { 
00269         return _ident;
00270     }
00271     LoggingDestination    destination() { return _destination; };
00272 
00273 
00274     LogPriority getloglevel() { return _level; }
00275 
00276 
00277     const char * getloglevelname() {
00278         switch(_level) {
00279             case log_none:
00280                 return "log_none";
00281             case log_emerg:
00282                 return "log_emerg";
00283             case log_fatal:
00284                 return "log_fatal";
00285             case log_internal:
00286                 return "log_internal";
00287             case log_error:
00288                 return "log_error";
00289             case log_warning:
00290                 return "log_warning";
00291             case log_info:
00292                 return "log_info";
00293             case log_debug:
00294                 return "log_debug";
00295             case log_all:
00296                 return "log_all";
00297             default:
00298                 return "error: unknown";
00299                 
00300         }
00301     }
00302 
00303 
00304     LogPriority setloglevel( LogPriority prio);
00305 
00306 private:
00307     void _init1();
00308     void _init2();
00309     void _flush();
00310     void _openlogfile( const char *filename );
00311     void _closelogfile();
00312     NORET ErrLog(const ErrLog &); 
00313     
00314 
00315 } ;
00316 
00317 
00318 
00319 #endif