Ejemplo n.º 1
0
void
lagopus_log_emit(lagopus_log_level_t lv,
                 uint64_t debug_level,
                 const char *file,
                 int line,
                 const char *func,
                 const char *fmt, ...) {
  if ((lv != LAGOPUS_LOG_LEVEL_DEBUG && lv != LAGOPUS_LOG_LEVEL_TRACE) ||
      (lv == LAGOPUS_LOG_LEVEL_DEBUG &&
       ((uint16_t)((debug_level & 0xffff)) <= (s_dbg_level))) ||
      (lv == LAGOPUS_LOG_LEVEL_TRACE &&
       lagopus_log_check_trace_flags(debug_level) == true)) {

    va_list args;
    char date_buf[32];
    char msg[4096];
    size_t hdr_len;
    size_t left_len;
    char thd_info_buf[1024];
    pthread_t tid;
    char thd_name[32];
    int st = 0;
    int s_errno = errno;
    char trace_info_buf[1024];
    size_t trace_info_len = 0;

#ifdef DO_TRACE_DETAIL
    bool do_trace_detail = false;
    if (lv == LAGOPUS_LOG_LEVEL_TRACE) {
      do_trace_detail =
        ((debug_level & 0xffffffff00000000LL) == 0x0000000100000000LL) ?
        true : false;
    }
#endif /* DO_TRACE_DETAIL */

    if (lv == LAGOPUS_LOG_LEVEL_TRACE) {
      uint32_t f = (uint32_t)debug_level & 0xffffffff;
      trace_info_len = s_get_trace_str(f,
                                       trace_info_buf,
                                       sizeof(trace_info_buf));
    }

    if (s_do_date == true) {
      s_get_date_str(date_buf, sizeof(date_buf));
    } else {
      date_buf[0] = '\0';
    }

    tid = pthread_self();
#ifdef HAVE_PTHREAD_SETNAME_NP
    st = pthread_getname_np(tid, thd_name, sizeof(thd_name));
#else
    thd_name[0] = '\0';
    st = -1;
#endif /* HAVE_PTHREAD_SETNAME_NP */
#if SIZEOF_PTHREAD_T == SIZEOF_INT64_T
#define TIDFMT "0x" PFTIDS(016, x)
#elif SIZEOF_PTHREAD_T == SIZEOF_INT
#define TIDFMT "0x" PFTIDS(08, x)
#endif /* SIZEOF_PTHREAD_T == SIZEOF_INT64_T ... */
    if (st == 0 && IS_VALID_STRING(thd_name) == true) {
      snprintf(thd_info_buf, sizeof(thd_info_buf), "[%u:" TIDFMT ":%s]",
               (unsigned int)getpid(),
               tid,
               thd_name);
    } else {
      snprintf(thd_info_buf, sizeof(thd_info_buf), "[%u:" TIDFMT "]",
               (unsigned int)getpid(),
               tid);
    }

    va_start(args, fmt);
    va_end(args);

    if (trace_info_len == 0) {
      hdr_len = (size_t)snprintf(msg, sizeof(msg),
                                 "%s%s%s:%s:%d:%s: ",
                                 date_buf,
                                 s_get_level_str(lv),
                                 thd_info_buf,
                                 file, line, func);
    } else {
      hdr_len = (size_t)snprintf(msg, sizeof(msg),
                                 "%s[%s%s]%s:%s:%d:%s: ",
                                 date_buf,
                                 s_get_level_str(lv), trace_info_buf,
                                 thd_info_buf,
                                 file, line, func);
    }

    /*
     * hdr_len indicates the buffer length WITHOUT '\0'.
     */
    left_len = sizeof(msg) - hdr_len;
    if (left_len > 1) {
      (void)vsnprintf(msg + hdr_len, left_len -1, fmt, args);
    }

    s_do_log(lv, msg);

    errno = s_errno;
  }
}
Ejemplo n.º 2
0
void
mccp_log_emit(mccp_log_level_t lv,
              uint64_t flags,
              const char *file,
              int line,
              const char *func,
              const char *fmt, ...) {
  if ((lv != MCCP_LOG_LEVEL_DEBUG && lv != MCCP_LOG_LEVEL_TRACE) ||
      (lv == MCCP_LOG_LEVEL_DEBUG &&
       flags <= s_dbg_level) ||
      (lv == MCCP_LOG_LEVEL_TRACE &&
       (s_trace_flags & flags) != 0LL)) {

    va_list args;
    char date_buf[32];
    char msg[4096];
    size_t hdr_len;
    size_t left_len;
    char thd_info_buf[1024];
    pthread_t tid;
    char thd_name[32];
    int st = 0;
    int s_errno = errno;

    if (s_do_date == true) {
      s_get_date_str(date_buf, sizeof(date_buf));
    } else {
      date_buf[0] = '\0';
    }

    tid = pthread_self();
#ifdef HAVE_PTHREAD_SETNAME_NP
    st = pthread_getname_np(tid, thd_name, sizeof(thd_name));
#else
    thd_name[0] = '\0';
    st = -1;
#endif /* HAVE_PTHREAD_SETNAME_NP */
#if SIZEOF_PTHREAD_T == SIZEOF_INT64_T
#define TIDFMT "0x" PFTIDS(016, x)
#if SIZEOF_INT64_T == SIZEOF_LONG_INT
#define TIDTYPE long int
#else
#define TIDTYPE int64_t
#endif /* SIZEOF_INT64_T == SIZEOF_LONG_INT */
#elif SIZEOF_PTHREAD_T == SIZEOF_INT
#define TIDFMT "0x" PFTIDS(08, x)
#define TIDTYPE int32_t
#endif /* SIZEOF_PTHREAD_T == SIZEOF_INT64_T ... */
    if (st == 0 && IS_VALID_STRING(thd_name) == true) {
      snprintf(thd_info_buf, sizeof(thd_info_buf), "[%u:" TIDFMT ":%s]",
               (unsigned int)getpid(),
               (TIDTYPE)tid,
               thd_name);
    } else {
      snprintf(thd_info_buf, sizeof(thd_info_buf), "[%u:" TIDFMT "]",
               (unsigned int)getpid(),
               (TIDTYPE)tid);
    }
#undef TIDFMT
#undef TIDTYPE

    va_start(args, fmt);
    va_end(args);

    hdr_len = (size_t)snprintf(msg, sizeof(msg),
                               "%s%s%s:%s:%d:%s: ",
                               date_buf,
                               s_get_level_str(lv),
                               thd_info_buf,
                               file, line, func);

    /*
     * hdr_len indicates the buffer length WITHOUT '\0'.
     */
    left_len = sizeof(msg) - hdr_len;
    if (left_len > 1) {
      (void)vsnprintf(msg + hdr_len, left_len -1, fmt, args);
    }

    s_do_log(lv, msg);

    errno = s_errno;
  }
}