ucx/logging.c

changeset 80
0125e4089f88
parent 67
27e67e725d35
child 81
86a23238d8a1
     1.1 --- a/ucx/logging.c	Wed Feb 06 14:31:44 2013 +0100
     1.2 +++ b/ucx/logging.c	Wed Feb 06 14:35:15 2013 +0100
     1.3 @@ -1,20 +1,63 @@
     1.4  #include "logging.h"
     1.5  #include <stdlib.h>
     1.6 +#include <string.h>
     1.7  
     1.8 -UcxLogger *ucx_logger_new(FILE *stream, unsigned int level) {
     1.9 +UcxLogger *ucx_logger_new(FILE *stream, unsigned int level, unsigned int mask) {
    1.10      UcxLogger *logger = (UcxLogger*) malloc(sizeof(UcxLogger));
    1.11      if (logger != NULL) {
    1.12          logger->stream = stream;
    1.13          logger->level = level;
    1.14 +        logger->mask = mask;
    1.15 +        logger->levels = ucx_map_new(8);
    1.16 +        
    1.17 +        unsigned int l;
    1.18 +        l = UCX_LOGGER_ERROR;
    1.19 +        ucx_map_int_put(logger->levels, l, "[ERROR]");
    1.20 +        l = UCX_LOGGER_WARN;
    1.21 +        ucx_map_int_put(logger->levels, l, "[WARNING]");
    1.22 +        l = UCX_LOGGER_INFO;
    1.23 +        ucx_map_int_put(logger->levels, l, "[INFO]");
    1.24 +        l = UCX_LOGGER_TRACE;
    1.25 +        ucx_map_int_put(logger->levels, l, "[TRACE]");
    1.26      }
    1.27  
    1.28      return logger;
    1.29  }
    1.30  
    1.31 +void ucx_logger_free(UcxLogger *logger) {
    1.32 +    ucx_map_free(logger->levels);
    1.33 +    free(logger);
    1.34 +}
    1.35 +
    1.36  void ucx_logger_log(UcxLogger *logger, unsigned int level,
    1.37 -        const sstr_t message) {
    1.38 +        const sstr_t message, const char* file, const unsigned int line) {
    1.39      if (level <= logger->level) {
    1.40 -        fwrite(message.ptr, 1, message.length, logger->stream);
    1.41 +        size_t n = message.length;
    1.42 +        if ((logger->mask & UCX_LOGGER_SOURCE) > 0) {
    1.43 +            n += strlen(file);
    1.44 +            n += 10; // line
    1.45 +        }
    1.46 +        // TODO: add k bytes for timestamp
    1.47 +        n += 16; // extra space for fill characters (:, -, etc.)
    1.48 +        
    1.49 +        char msg[n];
    1.50 +        off_t k = 0;
    1.51 +        
    1.52 +        if ((logger->mask & UCX_LOGGER_LEVEL) > 0) {
    1.53 +            k += sprintf(msg+k, "%s ", (char*)
    1.54 +                    ucx_map_int_get(logger->levels, level));
    1.55 +        }
    1.56 +        // TODO: timestamp
    1.57 +        if ((logger->mask & UCX_LOGGER_SOURCE) > 0) {
    1.58 +            k += sprintf(msg+k, "%s:%d ", file, line);
    1.59 +        }
    1.60 +        
    1.61 +        msg[k++] = '-'; msg[k++] = ' '; msg[k] = 0;
    1.62 +        strncat(msg, message.ptr, message.length);
    1.63 +        k += message.length;
    1.64 +        msg[k++] = '\n';
    1.65 +        
    1.66 +        fwrite(msg, 1, k, logger->stream);
    1.67          fflush(logger->stream);
    1.68      }
    1.69  }

mercurial