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

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

mercurial