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
00015 int Logger::bufresize(int sz)
00016 {
00017 int nsz;
00018
00019
00020 nsz = (sz + 0x1000) & ~0xfff;
00021 if (nsz != bufsz) {
00022
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
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
00067 nl++;
00068 p = buf;
00069 while ((*p++ = *nl++) != '\0');
00070 }
00071 buflen = strlen(buf);
00072 }
00073
00074
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
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 }