ucx/logging.c

Fri, 08 Feb 2013 11:25:04 +0100

author
Mike Becker <universe@uap-core.de>
date
Fri, 08 Feb 2013 11:25:04 +0100
changeset 82
6068d965328b
parent 81
86a23238d8a1
child 83
3b552d7a9610
permissions
-rw-r--r--

logger can now log timestamps

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

mercurial