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 } |