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 #include <utils/logging/file.h>
00026 #include <utils/system/file.h>
00027
00028 #include <core/threading/mutex.h>
00029
00030 #include <stdlib.h>
00031 #include <sys/time.h>
00032 #include <time.h>
00033 #include <cstdio>
00034
00035 namespace fawkes {
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 FileLogger::FileLogger(const char* filename, LogLevel log_level)
00050 : Logger(log_level)
00051 {
00052 try {
00053 log_file = new File(filename, File::APPEND);
00054 } catch (UnableToOpenFileException& e) {
00055 throw;
00056 }
00057
00058 now_s = (struct tm *)malloc(sizeof(struct tm));
00059
00060 mutex = new Mutex();
00061 }
00062
00063
00064
00065 FileLogger::~FileLogger()
00066 {
00067 free(now_s);
00068
00069 delete log_file;
00070 delete mutex;
00071 }
00072
00073
00074 void
00075 FileLogger::log_debug(const char *component, const char *format, ...)
00076 {
00077 va_list arg;
00078 va_start(arg, format);
00079 vlog_debug(component, format, arg);
00080 va_end(arg);
00081 }
00082
00083
00084 void
00085 FileLogger::log_info(const char *component, const char *format, ...)
00086 {
00087 va_list arg;
00088 va_start(arg, format);
00089 vlog_info(component, format, arg);
00090 va_end(arg);
00091 }
00092
00093
00094 void
00095 FileLogger::log_warn(const char *component, const char *format, ...)
00096 {
00097 va_list arg;
00098 va_start(arg, format);
00099 vlog_warn(component, format, arg);
00100 va_end(arg);
00101 }
00102
00103
00104 void
00105 FileLogger::log_error(const char *component, const char *format, ...)
00106 {
00107 va_list arg;
00108 va_start(arg, format);
00109 vlog_error(component, format, arg);
00110 va_end(arg);
00111 }
00112
00113
00114 void
00115 FileLogger::log_debug(const char *component, Exception &e)
00116 {
00117 if ( log_level <= LL_DEBUG ) {
00118 struct timeval now;
00119 gettimeofday(&now, NULL);
00120 mutex->lock();
00121 localtime_r(&now.tv_sec, now_s);
00122 for (Exception::iterator i = e.begin(); i != e.end(); ++i) {
00123 fprintf(log_file->stream(), "%s %02d:%02d:%02d.%06ld %s [EXCEPTION]: ", "D", now_s->tm_hour,
00124 now_s->tm_min, now_s->tm_sec, now.tv_usec, component);
00125 fprintf(log_file->stream(), "%s", *i);
00126 fprintf(log_file->stream(), "\n");
00127 }
00128 fflush(log_file->stream());
00129 mutex->unlock();
00130 }
00131 }
00132
00133
00134 void
00135 FileLogger::log_info(const char *component, Exception &e)
00136 {
00137 if ( log_level <= LL_INFO ) {
00138 struct timeval now;
00139 gettimeofday(&now, NULL);
00140 mutex->lock();
00141 localtime_r(&now.tv_sec, now_s);
00142 for (Exception::iterator i = e.begin(); i != e.end(); ++i) {
00143 fprintf(log_file->stream(), "%s %02d:%02d:%02d.%06ld %s [EXCEPTION]: ", "I", now_s->tm_hour,
00144 now_s->tm_min, now_s->tm_sec, now.tv_usec, component);
00145 fprintf(log_file->stream(), "%s", *i);
00146 fprintf(log_file->stream(), "\n");
00147 }
00148 fflush(log_file->stream());
00149 mutex->unlock();
00150 }
00151 }
00152
00153
00154 void
00155 FileLogger::log_warn(const char *component, Exception &e)
00156 {
00157 if ( log_level <= LL_WARN ) {
00158 struct timeval now;
00159 gettimeofday(&now, NULL);
00160 mutex->lock();
00161 localtime_r(&now.tv_sec, now_s);
00162 for (Exception::iterator i = e.begin(); i != e.end(); ++i) {
00163 fprintf(log_file->stream(), "%s %02d:%02d:%02d.%06ld %s [EXCEPTION]: ", "W", now_s->tm_hour,
00164 now_s->tm_min, now_s->tm_sec, now.tv_usec, component);
00165 fprintf(log_file->stream(), "%s", *i);
00166 fprintf(log_file->stream(), "\n");
00167 }
00168 fflush(log_file->stream());
00169 mutex->unlock();
00170 }
00171 }
00172
00173
00174 void
00175 FileLogger::log_error(const char *component, Exception &e)
00176 {
00177 if ( log_level <= LL_ERROR ) {
00178 struct timeval now;
00179 gettimeofday(&now, NULL);
00180 mutex->lock();
00181 localtime_r(&now.tv_sec, now_s);
00182 for (Exception::iterator i = e.begin(); i != e.end(); ++i) {
00183 fprintf(log_file->stream(), "%s %02d:%02d:%02d.%06ld %s [EXCEPTION]: ", "E", now_s->tm_hour,
00184 now_s->tm_min, now_s->tm_sec, now.tv_usec, component);
00185 fprintf(log_file->stream(), "%s", *i);
00186 fprintf(log_file->stream(), "\n");
00187 }
00188 fflush(log_file->stream());
00189 mutex->unlock();
00190 }
00191 }
00192
00193
00194 void
00195 FileLogger::vlog_debug(const char* component, const char* format, va_list va)
00196 {
00197 if (log_level <= LL_DEBUG ) {
00198 struct timeval now;
00199 gettimeofday(&now, NULL);
00200 mutex->lock();
00201 localtime_r(&now.tv_sec, now_s);
00202 fprintf(log_file->stream(), "%s %02d:%02d:%02d.%06ld %s: ", "D", now_s->tm_hour,
00203 now_s->tm_min, now_s->tm_sec, now.tv_usec, component);
00204 vfprintf(log_file->stream(), format, va);
00205 fprintf(log_file->stream(), "\n");
00206 fflush(log_file->stream());
00207 mutex->unlock();
00208 }
00209 }
00210
00211
00212 void
00213 FileLogger::vlog_info(const char *component, const char *format, va_list va)
00214 {
00215 if (log_level <= LL_INFO ) {
00216 struct timeval now;
00217 gettimeofday(&now, NULL);
00218 mutex->lock();
00219 localtime_r(&now.tv_sec, now_s);
00220 fprintf(log_file->stream(), "%s %02d:%02d:%02d.%06ld %s: ", "I", now_s->tm_hour,
00221 now_s->tm_min, now_s->tm_sec, now.tv_usec, component);
00222 vfprintf(log_file->stream(), format, va);
00223 fprintf(log_file->stream(), "\n");
00224 fflush(log_file->stream());
00225 mutex->unlock();
00226 }
00227 }
00228
00229
00230 void
00231 FileLogger::vlog_warn(const char *component, const char *format, va_list va)
00232 {
00233 if (log_level <= LL_WARN ) {
00234 struct timeval now;
00235 gettimeofday(&now, NULL);
00236 mutex->lock();
00237 localtime_r(&now.tv_sec, now_s);
00238 fprintf(log_file->stream(), "%s %02d:%02d:%02d.%06ld %s: ", "W", now_s->tm_hour,
00239 now_s->tm_min, now_s->tm_sec, now.tv_usec, component);
00240 vfprintf(log_file->stream(), format, va);
00241 fprintf(log_file->stream(), "\n");
00242 fflush(log_file->stream());
00243 mutex->unlock();
00244 }
00245 }
00246
00247
00248 void
00249 FileLogger::vlog_error(const char *component, const char *format, va_list va)
00250 {
00251 if (log_level <= LL_ERROR ) {
00252 struct timeval now;
00253 gettimeofday(&now, NULL);
00254 mutex->lock();
00255 localtime_r(&now.tv_sec, now_s);
00256 fprintf(log_file->stream(), "%s %02d:%02d:%02d.%06ld %s: ", "E", now_s->tm_hour,
00257 now_s->tm_min, now_s->tm_sec, now.tv_usec, component);
00258 vfprintf(log_file->stream(), format, va);
00259 fprintf(log_file->stream(), "\n");
00260 fflush(log_file->stream());
00261 mutex->unlock();
00262 }
00263 }
00264
00265
00266 void
00267 FileLogger::tlog_debug(struct timeval *t, const char *component, const char *format, ...)
00268 {
00269 va_list arg;
00270 va_start(arg, format);
00271 vtlog_debug(t, component, format, arg);
00272 va_end(arg);
00273 }
00274
00275
00276 void
00277 FileLogger::tlog_info(struct timeval *t, const char *component, const char *format, ...)
00278 {
00279 va_list arg;
00280 va_start(arg, format);
00281 vtlog_info(t, component, format, arg);
00282 va_end(arg);
00283 }
00284
00285
00286 void
00287 FileLogger::tlog_warn(struct timeval *t, const char *component, const char *format, ...)
00288 {
00289 va_list arg;
00290 va_start(arg, format);
00291 vtlog_warn(t, component, format, arg);
00292 va_end(arg);
00293 }
00294
00295
00296 void
00297 FileLogger::tlog_error(struct timeval *t, const char *component, const char *format, ...)
00298 {
00299 va_list arg;
00300 va_start(arg, format);
00301 vtlog_error(t, component, format, arg);
00302 va_end(arg);
00303 }
00304
00305
00306 void
00307 FileLogger::tlog_debug(struct timeval *t, const char *component, Exception &e)
00308 {
00309 if ( log_level <= LL_DEBUG ) {
00310 mutex->lock();
00311 localtime_r(&t->tv_sec, now_s);
00312 for (Exception::iterator i = e.begin(); i != e.end(); ++i) {
00313 fprintf(log_file->stream(), "%s %02d:%02d:%02d.%06ld %s [EXCEPTION]: ", "D", now_s->tm_hour,
00314 now_s->tm_min, now_s->tm_sec, t->tv_usec, component);
00315 fprintf(log_file->stream(), "%s", *i);
00316 fprintf(log_file->stream(), "\n");
00317 }
00318 fflush(log_file->stream());
00319 mutex->unlock();
00320 }
00321 }
00322
00323
00324 void
00325 FileLogger::tlog_info(struct timeval *t, const char *component, Exception &e)
00326 {
00327 if ( log_level <= LL_INFO ) {
00328 mutex->lock();
00329 localtime_r(&t->tv_sec, now_s);
00330 for (Exception::iterator i = e.begin(); i != e.end(); ++i) {
00331 fprintf(log_file->stream(), "%s %02d:%02d:%02d.%06ld %s [EXCEPTION]: ", "I", now_s->tm_hour,
00332 now_s->tm_min, now_s->tm_sec, t->tv_usec, component);
00333 fprintf(log_file->stream(), "%s", *i);
00334 fprintf(log_file->stream(), "\n");
00335 }
00336 fflush(log_file->stream());
00337 mutex->unlock();
00338 }
00339 }
00340
00341
00342 void
00343 FileLogger::tlog_warn(struct timeval *t, const char *component, Exception &e)
00344 {
00345 if ( log_level <= LL_WARN ) {
00346 mutex->lock();
00347 localtime_r(&t->tv_sec, now_s);
00348 for (Exception::iterator i = e.begin(); i != e.end(); ++i) {
00349 fprintf(log_file->stream(), "%s %02d:%02d:%02d.%06ld %s [EXCEPTION]: ", "W", now_s->tm_hour,
00350 now_s->tm_min, now_s->tm_sec, t->tv_usec, component);
00351 fprintf(log_file->stream(), "%s", *i);
00352 fprintf(log_file->stream(), "\n");
00353 }
00354 fflush(log_file->stream());
00355 mutex->unlock();
00356 }
00357 }
00358
00359
00360 void
00361 FileLogger::tlog_error(struct timeval *t, const char *component, Exception &e)
00362 {
00363 if ( log_level <= LL_ERROR ) {
00364 mutex->lock();
00365 localtime_r(&t->tv_sec, now_s);
00366 for (Exception::iterator i = e.begin(); i != e.end(); ++i) {
00367 fprintf(log_file->stream(), "%s %02d:%02d:%02d.%06ld %s [EXCEPTION]: ", "E", now_s->tm_hour,
00368 now_s->tm_min, now_s->tm_sec, t->tv_usec, component);
00369 fprintf(log_file->stream(), "%s", *i);
00370 fprintf(log_file->stream(), "\n");
00371 }
00372 fflush(log_file->stream());
00373 mutex->unlock();
00374 }
00375 }
00376
00377
00378 void
00379 FileLogger::vtlog_debug(struct timeval *t, const char* component, const char* format, va_list va)
00380 {
00381 if (log_level <= LL_DEBUG ) {
00382 mutex->lock();
00383 localtime_r(&t->tv_sec, now_s);
00384 fprintf(log_file->stream(), "%s %02d:%02d:%02d.%06ld %s: ", "D", now_s->tm_hour,
00385 now_s->tm_min, now_s->tm_sec, t->tv_usec, component);
00386 vfprintf(log_file->stream(), format, va);
00387 fprintf(log_file->stream(), "\n");
00388 fflush(log_file->stream());
00389 mutex->unlock();
00390 }
00391 }
00392
00393
00394 void
00395 FileLogger::vtlog_info(struct timeval *t, const char *component, const char *format, va_list va)
00396 {
00397 if (log_level <= LL_INFO ) {
00398 mutex->lock();
00399 localtime_r(&t->tv_sec, now_s);
00400 fprintf(log_file->stream(), "%s %02d:%02d:%02d.%06ld %s: ", "I", now_s->tm_hour,
00401 now_s->tm_min, now_s->tm_sec, t->tv_usec, component);
00402 vfprintf(log_file->stream(), format, va);
00403 fprintf(log_file->stream(), "\n");
00404 fflush(log_file->stream());
00405 mutex->unlock();
00406 }
00407 }
00408
00409
00410 void
00411 FileLogger::vtlog_warn(struct timeval *t, const char *component, const char *format, va_list va)
00412 {
00413 if (log_level <= LL_WARN ) {
00414 mutex->lock();
00415 localtime_r(&t->tv_sec, now_s);
00416 fprintf(log_file->stream(), "%s %02d:%02d:%02d.%06ld %s: ", "W", now_s->tm_hour,
00417 now_s->tm_min, now_s->tm_sec, t->tv_usec, component);
00418 vfprintf(log_file->stream(), format, va);
00419 fprintf(log_file->stream(), "\n");
00420 fflush(log_file->stream());
00421 mutex->unlock();
00422 }
00423 }
00424
00425
00426 void
00427 FileLogger::vtlog_error(struct timeval *t, const char *component, const char *format, va_list va)
00428 {
00429 if (log_level <= LL_ERROR ) {
00430 mutex->lock();
00431 localtime_r(&t->tv_sec, now_s);
00432 fprintf(log_file->stream(), "%s %02d:%02d:%02d.%06ld %s: ", "E", now_s->tm_hour,
00433 now_s->tm_min, now_s->tm_sec, t->tv_usec, component);
00434 vfprintf(log_file->stream(), format, va);
00435 fprintf(log_file->stream(), "\n");
00436 fflush(log_file->stream());
00437 mutex->unlock();
00438 }
00439 }
00440
00441
00442 }