1 #include "logging.h" |
1 #include "logging.h" |
2 #include <stdlib.h> |
2 #include <stdlib.h> |
3 #include <string.h> |
3 #include <string.h> |
4 #include <stdarg.h> |
4 #include <stdarg.h> |
|
5 #include <time.h> |
5 |
6 |
6 UcxLogger *ucx_logger_new(FILE *stream, unsigned int level, unsigned int mask) { |
7 UcxLogger *ucx_logger_new(FILE *stream, unsigned int level, unsigned int mask) { |
7 UcxLogger *logger = (UcxLogger*) malloc(sizeof(UcxLogger)); |
8 UcxLogger *logger = (UcxLogger*) malloc(sizeof(UcxLogger)); |
8 if (logger != NULL) { |
9 if (logger != NULL) { |
9 logger->stream = stream; |
10 logger->stream = stream; |
10 logger->writer = fwrite; |
11 logger->writer = (write_func)fwrite; |
|
12 logger->dateformat = "%F %T %z "; |
11 logger->level = level; |
13 logger->level = level; |
12 logger->mask = mask; |
14 logger->mask = mask; |
13 logger->levels = ucx_map_new(8); |
15 logger->levels = ucx_map_new(8); |
14 |
16 |
15 unsigned int l; |
17 unsigned int l; |
29 void ucx_logger_free(UcxLogger *logger) { |
31 void ucx_logger_free(UcxLogger *logger) { |
30 ucx_map_free(logger->levels); |
32 ucx_map_free(logger->levels); |
31 free(logger); |
33 free(logger); |
32 } |
34 } |
33 |
35 |
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 } |
|
43 |
|
44 void ucx_logger_logf(UcxLogger *logger, unsigned int level, const char* file, |
36 void ucx_logger_logf(UcxLogger *logger, unsigned int level, const char* file, |
45 const unsigned int line, const char *format, ...) { |
37 const unsigned int line, const char *format, ...) { |
46 if (level <= logger->level) { |
38 if (level <= logger->level) { |
47 const size_t max = 4096; // estimated maximum message length |
39 const size_t max = 4096; // estimated maximum message length |
48 char msg[max]; |
40 char msg[max]; |
55 n = strlen(text); |
47 n = strlen(text); |
56 memcpy(msg+k, text, n); |
48 memcpy(msg+k, text, n); |
57 k += n; |
49 k += n; |
58 msg[k++] = ' '; |
50 msg[k++] = ' '; |
59 } |
51 } |
60 // TODO: timestamp |
52 if ((logger->mask & UCX_LOGGER_TIMESTAMP) > 0) { |
|
53 time_t now = time(NULL); |
|
54 k += strftime(msg+k, 128, logger->dateformat, localtime(&now)); |
|
55 } |
61 if ((logger->mask & UCX_LOGGER_SOURCE) > 0) { |
56 if ((logger->mask & UCX_LOGGER_SOURCE) > 0) { |
62 n = strlen(file); |
57 n = strlen(file); |
63 memcpy(msg+k, file, n); |
58 memcpy(msg+k, file, n); |
64 k += n; |
59 k += n; |
65 k += sprintf(msg+k, ":%d ", line); |
60 k += sprintf(msg+k, ":%d ", line); |