ucx/logging.c

changeset 82
6068d965328b
parent 81
86a23238d8a1
child 83
3b552d7a9610
equal deleted inserted replaced
81:86a23238d8a1 82:6068d965328b
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);

mercurial