ucx/logging.c

Wed, 06 Feb 2013 14:35:15 +0100

author
Mike Becker <universe@uap-core.de>
date
Wed, 06 Feb 2013 14:35:15 +0100
changeset 80
0125e4089f88
parent 67
27e67e725d35
child 81
86a23238d8a1
permissions
-rw-r--r--

Fixed map tests + added some formatting options to logger

     1 #include "logging.h"
     2 #include <stdlib.h>
     3 #include <string.h>
     5 UcxLogger *ucx_logger_new(FILE *stream, unsigned int level, unsigned int mask) {
     6     UcxLogger *logger = (UcxLogger*) malloc(sizeof(UcxLogger));
     7     if (logger != NULL) {
     8         logger->stream = stream;
     9         logger->level = level;
    10         logger->mask = mask;
    11         logger->levels = ucx_map_new(8);
    13         unsigned int l;
    14         l = UCX_LOGGER_ERROR;
    15         ucx_map_int_put(logger->levels, l, "[ERROR]");
    16         l = UCX_LOGGER_WARN;
    17         ucx_map_int_put(logger->levels, l, "[WARNING]");
    18         l = UCX_LOGGER_INFO;
    19         ucx_map_int_put(logger->levels, l, "[INFO]");
    20         l = UCX_LOGGER_TRACE;
    21         ucx_map_int_put(logger->levels, l, "[TRACE]");
    22     }
    24     return logger;
    25 }
    27 void ucx_logger_free(UcxLogger *logger) {
    28     ucx_map_free(logger->levels);
    29     free(logger);
    30 }
    32 void ucx_logger_log(UcxLogger *logger, unsigned int level,
    33         const sstr_t message, const char* file, const unsigned int line) {
    34     if (level <= logger->level) {
    35         size_t n = message.length;
    36         if ((logger->mask & UCX_LOGGER_SOURCE) > 0) {
    37             n += strlen(file);
    38             n += 10; // line
    39         }
    40         // TODO: add k bytes for timestamp
    41         n += 16; // extra space for fill characters (:, -, etc.)
    43         char msg[n];
    44         off_t k = 0;
    46         if ((logger->mask & UCX_LOGGER_LEVEL) > 0) {
    47             k += sprintf(msg+k, "%s ", (char*)
    48                     ucx_map_int_get(logger->levels, level));
    49         }
    50         // TODO: timestamp
    51         if ((logger->mask & UCX_LOGGER_SOURCE) > 0) {
    52             k += sprintf(msg+k, "%s:%d ", file, line);
    53         }
    55         msg[k++] = '-'; msg[k++] = ' '; msg[k] = 0;
    56         strncat(msg, message.ptr, message.length);
    57         k += message.length;
    58         msg[k++] = '\n';
    60         fwrite(msg, 1, k, logger->stream);
    61         fflush(logger->stream);
    62     }
    63 }

mercurial