Example #1
0
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);
}
Example #2
0
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);
    }
  }
}
Example #3
0
/* 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);
  }
}