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, ...) { 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); } }