ucx/logging.c

Wed, 27 Feb 2013 13:30:21 +0100

author
Mike Becker <universe@uap-core.de>
date
Wed, 27 Feb 2013 13:30:21 +0100
changeset 95
ecfdc1c4a552
parent 83
3b552d7a9610
child 103
08018864fb91
permissions
-rw-r--r--

added gnu++11 support

olaf@57 1 #include "logging.h"
olaf@57 2 #include <stdlib.h>
universe@80 3 #include <string.h>
universe@81 4 #include <stdarg.h>
universe@82 5 #include <time.h>
olaf@57 6
universe@83 7 UcxLogger *ucx_logger_new(void *stream, unsigned int level, unsigned int mask) {
olaf@57 8 UcxLogger *logger = (UcxLogger*) malloc(sizeof(UcxLogger));
olaf@57 9 if (logger != NULL) {
olaf@57 10 logger->stream = stream;
universe@82 11 logger->writer = (write_func)fwrite;
universe@95 12 logger->dateformat = (char*) "%F %T %z ";
olaf@57 13 logger->level = level;
universe@80 14 logger->mask = mask;
universe@80 15 logger->levels = ucx_map_new(8);
universe@80 16
universe@80 17 unsigned int l;
universe@80 18 l = UCX_LOGGER_ERROR;
universe@95 19 ucx_map_int_put(logger->levels, l, (void*) "[ERROR]");
universe@80 20 l = UCX_LOGGER_WARN;
universe@95 21 ucx_map_int_put(logger->levels, l, (void*) "[WARNING]");
universe@80 22 l = UCX_LOGGER_INFO;
universe@95 23 ucx_map_int_put(logger->levels, l, (void*) "[INFO]");
universe@80 24 l = UCX_LOGGER_TRACE;
universe@95 25 ucx_map_int_put(logger->levels, l, (void*) "[TRACE]");
olaf@57 26 }
olaf@57 27
olaf@57 28 return logger;
olaf@57 29 }
olaf@57 30
universe@80 31 void ucx_logger_free(UcxLogger *logger) {
universe@80 32 ucx_map_free(logger->levels);
universe@80 33 free(logger);
universe@80 34 }
universe@80 35
universe@81 36 void ucx_logger_logf(UcxLogger *logger, unsigned int level, const char* file,
universe@81 37 const unsigned int line, const char *format, ...) {
olaf@57 38 if (level <= logger->level) {
universe@81 39 const size_t max = 4096; // estimated maximum message length
universe@81 40 char msg[max];
universe@81 41 char *text;
universe@81 42 size_t k = 0;
universe@81 43 size_t n;
universe@80 44
universe@80 45 if ((logger->mask & UCX_LOGGER_LEVEL) > 0) {
universe@81 46 text = (char*) ucx_map_int_get(logger->levels, level);
universe@81 47 n = strlen(text);
universe@81 48 memcpy(msg+k, text, n);
universe@81 49 k += n;
universe@81 50 msg[k++] = ' ';
universe@80 51 }
universe@82 52 if ((logger->mask & UCX_LOGGER_TIMESTAMP) > 0) {
universe@82 53 time_t now = time(NULL);
universe@82 54 k += strftime(msg+k, 128, logger->dateformat, localtime(&now));
universe@82 55 }
universe@80 56 if ((logger->mask & UCX_LOGGER_SOURCE) > 0) {
universe@81 57 n = strlen(file);
universe@81 58 memcpy(msg+k, file, n);
universe@81 59 k += n;
universe@81 60 k += sprintf(msg+k, ":%d ", line);
universe@80 61 }
universe@80 62
universe@81 63 msg[k++] = '-'; msg[k++] = ' ';
universe@81 64
universe@81 65 va_list args;
universe@81 66 va_start (args, format);
universe@81 67 k += vsnprintf(msg+k, max-k-1, format, args);
universe@81 68 va_end (args);
universe@81 69
universe@80 70 msg[k++] = '\n';
universe@80 71
universe@81 72 logger->writer(msg, 1, k, logger->stream);
olaf@57 73 }
olaf@57 74 }

mercurial