1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 #include "ucx/logging.h"
30
31 #include <stdlib.h>
32 #include <string.h>
33 #include <stdarg.h>
34 #include <time.h>
35
36 UcxLogger *ucx_logger_new(
void *stream,
unsigned int level,
unsigned int mask) {
37 UcxLogger *logger = (UcxLogger*) malloc(
sizeof(UcxLogger));
38 if (logger !=
NULL) {
39 logger->stream = stream;
40 logger->writer = (write_func)fwrite;
41 logger->dateformat = (
char*)
"%F %T %z ";
42 logger->level = level;
43 logger->mask = mask;
44 logger->levels = ucx_map_new(
8);
45
46 unsigned int l;
47 l =
UCX_LOGGER_ERROR;
48 ucx_map_int_put(logger->levels, l, (
void*)
"[ERROR]");
49 l =
UCX_LOGGER_WARN;
50 ucx_map_int_put(logger->levels, l, (
void*)
"[WARNING]");
51 l =
UCX_LOGGER_INFO;
52 ucx_map_int_put(logger->levels, l, (
void*)
"[INFO]");
53 l =
UCX_LOGGER_DEBUG;
54 ucx_map_int_put(logger->levels, l, (
void*)
"[DEBUG]");
55 l =
UCX_LOGGER_TRACE;
56 ucx_map_int_put(logger->levels, l, (
void*)
"[TRACE]");
57 }
58
59 return logger;
60 }
61
62 void ucx_logger_free(UcxLogger *logger) {
63 ucx_map_free(logger->levels);
64 free(logger);
65 }
66
67
68 #define UCX_LOGGER_MSGMAX 4096
69
70 void ucx_logger_logf(UcxLogger *logger,
unsigned int level,
const char* file,
71 const unsigned int line,
const char *format, ...) {
72 if (level <= logger->level) {
73 char msg[
UCX_LOGGER_MSGMAX];
74 const char *text;
75 size_t k =
0;
76 size_t n;
77
78 if ((logger->mask &
UCX_LOGGER_LEVEL) >
0) {
79 text = (
const char*) ucx_map_int_get(logger->levels, level);
80 if (!text) {
81 text =
"[UNKNOWN]";
82 }
83 n = strlen(text);
84 n = n >
256 ?
256 : n;
85 memcpy(msg+k, text, n);
86 k += n;
87 msg[k++] =
' ';
88 }
89 if ((logger->mask &
UCX_LOGGER_TIMESTAMP) >
0) {
90 time_t now = time(
NULL);
91 k += strftime(msg+k,
128, logger->dateformat, localtime(&now));
92 }
93 if ((logger->mask &
UCX_LOGGER_SOURCE) >
0) {
94 char *fpart = strrchr(file,
'/');
95 if (fpart) file = fpart+
1;
96 fpart = strrchr(file,
'\\');
97 if (fpart) file = fpart+
1;
98 n = strlen(file);
99 memcpy(msg+k, file, n);
100 k += n;
101 k += sprintf(msg+k,
":%u ", line);
102 }
103
104 if (k >
0) {
105 msg[k++] =
'-'; msg[k++] =
' ';
106 }
107
108 va_list args;
109 va_start (args, format);
110 k += vsnprintf(msg+k,
UCX_LOGGER_MSGMAX-k-
1, format, args);
111 va_end (args);
112
113 msg[k++] =
'\n';
114
115 logger->writer(msg,
1, k, logger->stream);
116 }
117 }
118