00001
00002
00003
00004
00005
00006
00007
00008 #include "SysPlusPlus/Logger.h"
00009 #include <syslog.h>
00010
00011 #include <iostream>
00012 #include <stdarg.h>
00013 #include <stdio.h>
00014 #include <stdlib.h>
00015 #include <string.h>
00016 #include <sys/param.h>
00017 #include <time.h>
00018 #include <unistd.h>
00019 #include <errno.h>
00020 #include <cstring>
00021
00022 #include "SysPlusPlus/syscall.h"
00023 #include "SysPlusPlus/syslib.h"
00024
00025
00026
00027
00028 static syspp::Logger *instance_ ;
00029 static enum syspp::LogLevels Level;
00030
00031
00032
00033
00034 syspp::Logger * syspp::Logger::Instance( char *InstanceId ) {
00035 if (instance_ == NULL) {
00036 instance_ = new Logger(InstanceId);
00037 }
00038 return instance_;
00039 }
00040
00041
00042
00043 syspp::Logger * syspp::Logger::Instance( ) {
00044
00045 if (instance_ == NULL) {
00046 instance_ = new Logger((char*)"Logger");
00047 instance_->On = true;
00048 }
00049
00050 return instance_;
00051 }
00052
00053
00054
00055 syspp::Logger::~Logger () {
00056 }
00057
00058
00059
00060 void syspp::Logger::SetLevel ( enum LogLevels NewLevel ) {
00061
00062 Level = NewLevel;
00063
00064 }
00065
00066
00067
00068 void syspp::Logger::SwitchOn ( ) {
00069
00070 On=true;
00071
00072 }
00073
00074
00075 void syspp::Logger::SwitchOff ( ) {
00076
00077 On=false;
00078
00079 }
00080
00081
00082
00083 void syspp::Logger::Debug(const char* fmt, ...) {
00084
00085 if ( Level < LOGDEBUG )
00086 return;
00087
00088 va_list args;
00089 va_start(args, fmt);
00090 char buf[1024];
00091 vsnprintf(buf, sizeof(buf), fmt, args);
00092 va_end(args);
00093
00094 syspp::Logger *LogObj = syspp::Logger::Instance( );
00095 LogObj->log(LOGDEBUG, buf);
00096
00097 }
00098
00099
00100
00101 void syspp::Logger::Info(const char* fmt, ...) {
00102
00103 if ( Level < LOGINFO )
00104 return;
00105
00106 va_list args;
00107 va_start(args, fmt);
00108
00109 char buf[1024];
00110 vsnprintf(buf, sizeof(buf), fmt, args);
00111 va_end(args);
00112 syspp::Logger *LogObj = syspp::Logger::Instance( );
00113 LogObj->log(LOGINFO, buf);
00114
00115 }
00116
00117
00118
00119 void syspp::Logger::Notice(const char* fmt, ...) {
00120
00121 if ( Level < LOGNOTICE )
00122 return;
00123
00124 va_list args;
00125 va_start(args, fmt);
00126
00127 char buf[1024];
00128 vsnprintf(buf, sizeof(buf), fmt, args);
00129 va_end(args);
00130 syspp::Logger *LogObj = syspp::Logger::Instance( );
00131 LogObj->log(LOGNOTICE, buf);
00132
00133 }
00134
00135
00136
00137 void syspp::Logger::Warning(const char* fmt, ...) {
00138
00139 if ( Level < LOGWARNING )
00140 return;
00141
00142 va_list args;
00143 va_start(args, fmt);
00144
00145 char buf[1024];
00146 vsnprintf(buf, sizeof(buf), fmt, args);
00147 va_end(args);
00148
00149 syspp::Logger *LogObj = syspp::Logger::Instance( );
00150 LogObj->log(LOGWARNING, buf);
00151 }
00152
00153
00154
00155 void syspp::Logger::Error(const char* fmt, ...) {
00156
00157 if ( Level < LOGERROR )
00158 return;
00159
00160 va_list args;
00161 va_start(args, fmt);
00162
00163 char buf[1024];
00164 vsnprintf(buf, sizeof(buf), fmt, args);
00165 va_end(args);
00166
00167 syspp::Logger *LogObj = syspp::Logger::Instance( );
00168 if ( errno != 0 ) {
00169 char *buf1;
00170 char buf2[1024];
00171 buf1 = strerror ( errno) ;
00172
00173 sprintf ( buf2 , "%s. errno == %d (%s)", buf, errno, buf1 );
00174 LogObj->log(LOGERROR, buf2);
00175 } else {
00176 LogObj->log(LOGERROR, buf);
00177 }
00178 }
00179
00180
00181
00182 void syspp::Logger::Crit(const char* fmt, ...) {
00183 va_list args;
00184 va_start(args, fmt);
00185
00186 char buf[1024];
00187 vsnprintf(buf, sizeof(buf), fmt, args);
00188 va_end(args);
00189
00190 syspp::Logger *LogObj = syspp::Logger::Instance( );
00191 if ( errno != 0 ) {
00192 char *buf1;
00193 char buf2[1024];
00194 buf1 = strerror ( errno) ;
00195
00196 sprintf ( buf2 , "%s. errno == %d (%s)", buf, errno, buf1 );
00197 LogObj->log(LOGERROR, buf2);
00198 } else {
00199 LogObj->log(LOGCRIT, buf);
00200 }
00201 }
00202
00203
00204
00205 syspp::Logger::Logger( char *InstanceName) {
00206 InstanceId = strdup ( InstanceName );
00207 Fd = stdout ;
00208 SetLevel ( LOGWARNING );
00209
00210 #ifndef SPECIAL_DEBUG
00211 openlog(InstanceId, LOG_PID | LOG_NDELAY, LOG_USER );
00212 #endif
00213 }
00214
00215
00216
00217
00218 void syspp::Logger::log(int priority, const char* str) {
00219
00220 if ( On == false )
00221 return;
00222 char c [ 1000 ];
00223
00224 strcpy(c, "%s %s" );
00225 #ifdef SPECIAL_DEBUG
00226 fprintf(Fd, "%s\n", str );
00227 #else
00228 switch ( priority ) {
00229 case LOGCRIT: syslog ( LOG_CRIT, c, "CRIT", str ); break;
00230 case LOGERROR: syslog ( LOG_ERR, c, "ERR ", str ); break;
00231 case LOGWARNING: syslog ( LOG_WARNING, c, "WARN", str ); break;
00232 case LOGNOTICE: syslog ( LOG_NOTICE, c, "NOTI", str ); break;
00233 case LOGINFO: syslog ( LOG_INFO, c, "INFO", str ); break;
00234 case LOGDEBUG: syslog ( LOG_DEBUG, c, "DBG ", str ); break;
00235 }
00236 #endif
00237 }
00238
00239
00240
00241 #ifdef SPECIAL_DEBUG
00242 int main (int argc, char *argv [] ) {
00243
00244 syspp::Logger *LogObj = syspp::Logger::Instance( "Test" );
00245
00246 LogObj->SetLevel ( syspp::LOGDEBUG );
00247 LogObj->SwitchOn();
00248 LogObj->Debug ( "Debug" );
00249 LogObj->Info ( "Info" );
00250 LogObj->Notice ( "Notice" );
00251 LogObj->Warning ( "Warning");
00252 LogObj->Error ( "Error" );
00253 LogObj->Crit ( "Crit" );
00254
00255 return 0;
00256 }
00257 #endif