universe@103: /* universe@103: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. universe@103: * universe@259: * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved. universe@103: * universe@103: * Redistribution and use in source and binary forms, with or without universe@103: * modification, are permitted provided that the following conditions are met: universe@103: * universe@103: * 1. Redistributions of source code must retain the above copyright universe@103: * notice, this list of conditions and the following disclaimer. universe@103: * universe@103: * 2. Redistributions in binary form must reproduce the above copyright universe@103: * notice, this list of conditions and the following disclaimer in the universe@103: * documentation and/or other materials provided with the distribution. universe@103: * universe@103: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" universe@103: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE universe@103: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE universe@103: * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE universe@103: * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR universe@103: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF universe@103: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS universe@103: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN universe@103: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) universe@103: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE universe@103: * POSSIBILITY OF SUCH DAMAGE. universe@103: */ universe@103: universe@251: #include "ucx/logging.h" universe@251: olaf@57: #include universe@80: #include universe@81: #include universe@82: #include olaf@57: universe@83: UcxLogger *ucx_logger_new(void *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@95: logger->dateformat = (char*) "%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@95: ucx_map_int_put(logger->levels, l, (void*) "[ERROR]"); universe@80: l = UCX_LOGGER_WARN; universe@95: ucx_map_int_put(logger->levels, l, (void*) "[WARNING]"); universe@80: l = UCX_LOGGER_INFO; universe@95: ucx_map_int_put(logger->levels, l, (void*) "[INFO]"); universe@80: l = UCX_LOGGER_TRACE; universe@95: ucx_map_int_put(logger->levels, l, (void*) "[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@152: // estimated max. message length (documented) universe@152: #define UCX_LOGGER_MSGMAX 4096 universe@152: 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@152: char msg[UCX_LOGGER_MSGMAX]; 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@171: n = n > 256 ? 256 : n; 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@171: k += sprintf(msg+k, ":%u ", 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@152: k += vsnprintf(msg+k, UCX_LOGGER_MSGMAX-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: } olaf@57: }