Fri, 08 Feb 2013 10:37:24 +0100
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 }