ucx/logging.c

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

mercurial