ucx/logging.c

Fri, 08 Feb 2013 10:37:24 +0100

author
Mike Becker <universe@uap-core.de>
date
Fri, 08 Feb 2013 10:37:24 +0100
changeset 81
86a23238d8a1
parent 80
0125e4089f88
child 82
6068d965328b
permissions
-rw-r--r--

changed logger to behave more like printf + added possibility to specify write function

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

mercurial