Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

Logger.cc

Go to the documentation of this file.
00001 #include<stdlib.h>
00002 #include<stdio.h>
00003 #include<string.h>
00004 #ifndef WITH_SYSLOG
00005 #include<unistd.h>
00006 #include<time.h>
00007 #include<sys/time.h>
00008 #endif
00009 
00010 #include"Logger.h"
00011 
00012 using namespace std;
00013 
00014 // private:
00015 int Logger::bufresize(int sz)
00016 {
00017         int nsz;
00018 
00019         /* Round up to the next 4k boundary */
00020         nsz = (sz + 0x1000) & ~0xfff;
00021         if (nsz != bufsz) {
00022                 /* Add Space */
00023                 if (buf)
00024                         buf = (char *) realloc(buf, nsz);
00025                 else
00026                         buf = (char *) malloc(nsz);
00027                 if (!buf) {
00028                         bufsz = 0;
00029                         return 0;
00030                 }
00031                 bufsz = nsz;
00032         }
00033         return bufsz;
00034 }
00035 
00036 void Logger::append(const char *s)
00037 {
00038         int slen = strlen(s);
00039         if (bufresize(buflen + slen + 1) == 0)
00040                 exit(26);
00041         strcat(buf, s);
00042         buflen += slen;
00043 }
00044 
00045 void Logger::print()
00046 {
00047         char *nl, *p;
00048 
00049         while ((nl = strchr(buf, '\n')) != NULL) {
00050                 // Print first line
00051                 *nl = '\0';
00052 #ifdef WITH_SYSLOG
00053                 syslog(_priority, "%s", buf);
00054 #else
00055                 time_t ts;
00056                 struct tm *t;
00057                 char tbuf[32];
00058                 time(&ts);
00059                 t = localtime(&ts);
00060                 sprintf(tbuf, "%d %04d/%02d/%02d %02d:%02d:%02d ",
00061                         _priority, 1900 + t->tm_year, t->tm_mon,
00062                         t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
00063                 log << tbuf << buf << endl;
00064 #endif
00065 
00066                 // Move remaining string to the beginning
00067                 nl++;
00068                 p = buf;
00069                 while ((*p++ = *nl++) != '\0');
00070         }
00071         buflen = strlen(buf);
00072 }
00073 
00074 // public:
00075 #ifdef WITH_SYSLOG
00076 Logger::Logger()
00077 {
00078         buf = NULL;
00079         bufsz = 0;
00080         if (bufresize(1) == 0)
00081                 exit(26);
00082         buf[0] = '\0';
00083         buflen = 0;
00084         _priority = Debug;
00085 }
00086 
00087 void Logger::open(char *ident, int option, int facility)
00088 {
00089         openlog(ident, option, facility);
00090 }
00091 
00092 Logger::~Logger()
00093 {
00094         close();
00095 }
00096 
00097 void Logger::close()
00098 {
00099         closelog();
00100 }
00101 
00102 #else
00103 Logger::Logger(char *fn, int option)
00104 {
00105         buf = NULL;
00106         bufsz = 0;
00107         if (bufresize(1) == 0)
00108                 exit(26);
00109         buf[0] = '\0';
00110         buflen = 0;
00111         _priority = Debug;
00112 
00113         open(fn);
00114 }
00115 
00116 Logger::~Logger()
00117 {
00118         close();
00119 }
00120 
00121 void Logger::open(char *fn)
00122 {
00123         if (fn) {
00124                 log.open(fn, ios::app);
00125                 log.setf(ios::unitbuf);
00126         }
00127 }
00128 
00129 void Logger::close()
00130 {
00131         log.close();
00132 }
00133 #endif
00134 
00135 Logger & Logger::priority(int p)
00136 {
00137         _priority = p;
00138         if (buflen && buf[buflen - 1] != '\n')
00139                 write("\n");
00140         return *this;
00141 }
00142 
00143 Logger & Logger::write(const char *s)
00144 {
00145         append(s);
00146         print();
00147         return *this;
00148 }
00149 
00150 // friends:
00151 Logger & operator<<(Logger & l, const char *s)
00152 {
00153         return l.write(s);
00154 }
00155 
00156 Logger & operator<<(Logger & l, const string & s)
00157 {
00158         string s2(s);
00159         return l.write(s2.c_str());
00160 }
00161 
00162 Logger & operator<<(Logger & l, char ch)
00163 {
00164         return l.write(ch);
00165 }
00166 
00167 Logger & operator<<(Logger & l, unsigned int i)
00168 {
00169         char s[256];
00170         sprintf(s, "%u", i);
00171         return l.write(s);
00172 }
00173 
00174 Logger & operator<<(Logger & l, int i)
00175 {
00176         char s[256];
00177         sprintf(s, "%d", i);
00178         return l.write(s);
00179 }

Generated on Sun Oct 24 21:08:17 2004 for NewsCache by doxygen 1.3.6-20040222