static void logging_levels(void **state) { selene_conf_t *conf = NULL; selene_t *ctxt = NULL; selene_conf_create(&conf); SLN_ERR(selene_conf_use_reasonable_defaults(conf)); SLN_ERR(selene_server_create(conf, &ctxt)); SLN_ASSERT_CONTEXT(ctxt); sln_log_level_set(ctxt, SLN_LOG_NOTHING); assert_int_equal(SLN_LOG_NOTHING, sln_log_level_get(ctxt)); sln_log_level_set(ctxt, SLN_LOG_EVERYTHING); assert_int_equal(SLN_LOG_EVERYTHING, sln_log_level_get(ctxt)); selene_destroy(ctxt); selene_conf_destroy(conf); }
void sln_log_fmtv(selene_t *s, sln_log_level_e level, const char *fmt, va_list ap) { if (sln_log_level_get(s) >= level) { char buf[1024]; int rv = vsnprintf(&buf[0], sizeof(buf), fmt, ap); if (rv >= 0) { /* PQ:TODO: This is not as efficient as it could be, we could build * the log line inline here with a little code refactoring, rather than * an inline snprintf/calling out to the string based logger. */ sln_log(s, level, buf); } } }
/* Prepends date, level, and appends newline*/ void sln_log(selene_t *s, sln_log_level_e level, const char *str) { if (sln_log_level_get(s) < level) { return; } else { time_t t; char buf[1100] = {0}; size_t slen = 0; size_t blen = 0; size_t availlen; struct tm tm; struct tm *ptm; const char *llstr = NULL; slen = strlen(str); t = time(NULL); #ifdef _WIN32 /* modern version of msvc use a thread-local buffer for gmtime_r */ ptm = gmtime(&t); memcpy(&tm, ptm, sizeof(struct tm)); ptm = &tm; { char *p = asctime(ptm); memcpy(&buf[0], p, 24); } #else ptm = gmtime_r(&t, &tm); /* TODO: use a different time format ?*/ asctime_r(ptm, &buf[0]); #endif blen += 24; switch (level) { case SLN_LOG_CRITICAL: llstr = " CRT: "; break; case SLN_LOG_ERRORS: llstr = " ERR: "; break; case SLN_LOG_WARNINGS: llstr = " WRN: "; break; case SLN_LOG_INFO: llstr = " INF: "; break; case SLN_LOG_DEBUG: llstr = " DBG: "; break; case SLN_LOG_TRACE: llstr = " TRC: "; break; default: llstr = " UNK: "; break; } memcpy(&buf[0]+blen, llstr, 6); blen += 6; availlen = sizeof(buf) - blen - 2; if (slen > availlen) { slen = availlen; } memcpy(&buf[0]+blen, str, slen); blen += slen; memcpy(&buf[0]+blen, "\n\0", 2); blen += 2; sln_log_publish(s, level, &buf[0], blen); } }