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 }