static void __cs_log_check_duplicates(uint8_t hdr_len, uint8_t hdr_logcount_offset, uint8_t hdr_date_offset, uint8_t hdr_time_offset, uint8_t hdr_info_offset) { bool repeated_line = strcmp(last_log_txt, log_txt + hdr_len) == 0; if (last_log_duplicates > 0) { if (!cs_valid_time(&last_log_ts)) // Must be initialized once last_log_ts = log_ts; // Report duplicated lines when the new log line is different // than the old or 60 seconds have passed. int64_t gone = comp_timeb(&log_ts, &last_log_ts); if (!repeated_line || gone >= 60*1000) { uint8_t dupl_hdr_logcount_offset = 0, dupl_hdr_date_offset = 0, dupl_hdr_time_offset = 0, dupl_hdr_info_offset = 0; uint8_t dupl_header_len = get_log_header(dupl, sizeof(dupl), &dupl_hdr_logcount_offset, &dupl_hdr_date_offset, &dupl_hdr_time_offset, &dupl_hdr_info_offset); snprintf(dupl + dupl_header_len - 1, sizeof(dupl) - dupl_header_len, " (-) -- Skipped %u duplicated log lines --", last_log_duplicates); write_to_log_int(dupl, dupl_header_len, dupl_hdr_logcount_offset, dupl_hdr_date_offset, dupl_hdr_time_offset, dupl_hdr_info_offset); last_log_duplicates = 0; last_log_ts = log_ts; } } if (!repeated_line) { memcpy(last_log_txt, log_txt + hdr_len, LOG_BUF_SIZE - hdr_len); write_to_log_int(log_txt, hdr_len, hdr_logcount_offset, hdr_date_offset, hdr_time_offset, hdr_info_offset); } else { last_log_duplicates++; } }
void cs_log_int(uint16_t mask, int8_t lock __attribute__((unused)), const uchar *buf, int32_t n, const char *fmt, ...) { va_list params; char log_txt[LOG_BUF_SIZE]; int32_t i, len = 0; pthread_mutex_lock(&log_mutex); if (((mask & cs_dblevel) || !mask) && (fmt)) { va_start(params, fmt); len = get_log_header(1, log_txt); vsnprintf(log_txt + len, sizeof(log_txt) - len, fmt, params); va_end(params); int repeated_line = strcmp(last_log_txt, log_txt + len) == 0; if (last_log_duplicates > 0) { if (!last_log_ts) // Must be initialized once last_log_ts = log_ts; // Report duplicated lines when the new log line is different // than the old or 60 seconds have passed. if (!repeated_line || log_ts - last_log_ts >= 60) { char dupl[len + 32]; len = get_log_header(2, dupl); snprintf(dupl + len - 1, len + 32, "--- Skipped %d duplicated log lines ---", last_log_duplicates); write_to_log_int(dupl, 0); last_log_duplicates = 0; last_log_ts = log_ts; } } if (!repeated_line) { memcpy(last_log_txt, log_txt + len, LOG_BUF_SIZE); write_to_log_int(log_txt, len); } else { last_log_duplicates++; } } if (buf && ((mask & cs_dblevel) || !mask)) { for (i=0; i<n; i+=16) { len = get_log_header(0, log_txt); cs_hexdump(1, buf+i, (n-i>16) ? 16 : n-i, log_txt + len, sizeof(log_txt) - len); write_to_log_int(log_txt, len); } } pthread_mutex_unlock(&log_mutex); }
void cs_log_int(uint16_t mask, int8_t lock __attribute__((unused)), const uchar *buf, int32_t n, const char *fmt, ...) { va_list params; char log_txt[LOG_BUF_SIZE]; int32_t i, len = 0; if (((mask & cs_dblevel) || !mask) && (fmt)) { va_start(params, fmt); len = get_log_header(1, log_txt); vsnprintf(log_txt + len, sizeof(log_txt) - len, fmt, params); write_to_log_int(log_txt, len); va_end(params); } if (buf && (mask & cs_dblevel || !mask)) { for (i=0; i<n; i+=16) { len = get_log_header(0, log_txt); cs_hexdump(1, buf+i, (n-i>16) ? 16 : n-i, log_txt + len, sizeof(log_txt) - len); write_to_log_int(log_txt, len); } } }
void cs_log_hex(const char *log_prefix, const uint8_t *buf, int32_t n, const char *fmt, ...) { if(logStarted == 0) { return; } SAFE_MUTEX_LOCK_NOLOG(&log_mutex); __do_log(); if(buf) { int32_t i; __init_log_prefix("%10s "); for(i = 0; i < n; i += 16) { cs_hexdump(1, buf + i, (n - i > 16) ? 16 : n - i, log_txt + hdr_len + log_prefix_len, sizeof(log_txt) - (hdr_len + log_prefix_len)); write_to_log_int(log_txt, hdr_len, hdr_logcount_offset, hdr_date_offset, hdr_time_offset, hdr_info_offset); } } SAFE_MUTEX_UNLOCK_NOLOG(&log_mutex); }
void cs_log_int(uint16_t mask, int8_t lock __attribute__((unused)), const uchar *buf, int32_t n, const char *fmt, ...) { if((mask & cs_dblevel) || !mask) { va_list params; int32_t dupl_header_len, repeated_line, i, len = 0; pthread_mutex_lock(&log_mutex); if(fmt) { va_start(params, fmt); len = get_log_header(1, log_txt); vsnprintf(log_txt + len, sizeof(log_txt) - len, fmt, params); va_end(params); if(cfg.logduplicatelines) { memcpy(last_log_txt, log_txt + len, LOG_BUF_SIZE); write_to_log_int(log_txt, len); } else { repeated_line = strcmp(last_log_txt, log_txt + len) == 0; if(last_log_duplicates > 0) { if(!cs_valid_time(&last_log_ts)) // Must be initialized once { last_log_ts = log_ts; } // Report duplicated lines when the new log line is different // than the old or 60 seconds have passed. int32_t gone = comp_timeb(&log_ts, &last_log_ts); if(!repeated_line || gone >= 60*1000) { dupl_header_len = get_log_header(2, dupl); snprintf(dupl + dupl_header_len - 1, sizeof(dupl) - dupl_header_len, "--- Skipped %u duplicated log lines ---", last_log_duplicates); write_to_log_int(dupl, 0); last_log_duplicates = 0; last_log_ts = log_ts; } } if(!repeated_line) { memcpy(last_log_txt, log_txt + len, LOG_BUF_SIZE); write_to_log_int(log_txt, len); } else { last_log_duplicates++; } } } if(buf) { for(i = 0; i < n; i += 16) { len = get_log_header(0, log_txt); cs_hexdump(1, buf + i, (n - i > 16) ? 16 : n - i, log_txt + len, sizeof(log_txt) - len); write_to_log_int(log_txt, len); } } pthread_mutex_unlock(&log_mutex); } }