olaf@57: #include "logging.h" olaf@57: #include universe@80: #include universe@81: #include universe@82: #include olaf@57: universe@80: UcxLogger *ucx_logger_new(FILE *stream, unsigned int level, unsigned int mask) { olaf@57: UcxLogger *logger = (UcxLogger*) malloc(sizeof(UcxLogger)); olaf@57: if (logger != NULL) { olaf@57: logger->stream = stream; universe@82: logger->writer = (write_func)fwrite; universe@82: logger->dateformat = "%F %T %z "; olaf@57: logger->level = level; universe@80: logger->mask = mask; universe@80: logger->levels = ucx_map_new(8); universe@80: universe@80: unsigned int l; universe@80: l = UCX_LOGGER_ERROR; universe@80: ucx_map_int_put(logger->levels, l, "[ERROR]"); universe@80: l = UCX_LOGGER_WARN; universe@80: ucx_map_int_put(logger->levels, l, "[WARNING]"); universe@80: l = UCX_LOGGER_INFO; universe@80: ucx_map_int_put(logger->levels, l, "[INFO]"); universe@80: l = UCX_LOGGER_TRACE; universe@80: ucx_map_int_put(logger->levels, l, "[TRACE]"); olaf@57: } olaf@57: olaf@57: return logger; olaf@57: } olaf@57: universe@80: void ucx_logger_free(UcxLogger *logger) { universe@80: ucx_map_free(logger->levels); universe@80: free(logger); universe@80: } universe@80: universe@81: void ucx_logger_logf(UcxLogger *logger, unsigned int level, const char* file, universe@81: const unsigned int line, const char *format, ...) { olaf@57: if (level <= logger->level) { universe@81: const size_t max = 4096; // estimated maximum message length universe@81: char msg[max]; universe@81: char *text; universe@81: size_t k = 0; universe@81: size_t n; universe@80: universe@80: if ((logger->mask & UCX_LOGGER_LEVEL) > 0) { universe@81: text = (char*) ucx_map_int_get(logger->levels, level); universe@81: n = strlen(text); universe@81: memcpy(msg+k, text, n); universe@81: k += n; universe@81: msg[k++] = ' '; universe@80: } universe@82: if ((logger->mask & UCX_LOGGER_TIMESTAMP) > 0) { universe@82: time_t now = time(NULL); universe@82: k += strftime(msg+k, 128, logger->dateformat, localtime(&now)); universe@82: } universe@80: if ((logger->mask & UCX_LOGGER_SOURCE) > 0) { universe@81: n = strlen(file); universe@81: memcpy(msg+k, file, n); universe@81: k += n; universe@81: k += sprintf(msg+k, ":%d ", line); universe@80: } universe@80: universe@81: msg[k++] = '-'; msg[k++] = ' '; universe@81: universe@81: va_list args; universe@81: va_start (args, format); universe@81: k += vsnprintf(msg+k, max-k-1, format, args); universe@81: va_end (args); universe@81: universe@80: msg[k++] = '\n'; universe@80: universe@81: logger->writer(msg, 1, k, logger->stream); olaf@57: fflush(logger->stream); olaf@57: } olaf@57: }