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

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

mercurial