// formats and routes the record to all sinks void log_backend_record(int level, const char* section, const char* fmt, va_list arguments) { const auto& sinks = log_formatter_getSinks(); if (sinks.empty()) return; cur_record.sec = section; cur_record.fmt = fmt; cur_record.lvl = level; // format the record log_formatter_format(&cur_record, arguments); // check for duplicates after formatting; can not be // done in log_frontend_record or log_filter_record const int cmp = (prv_record.msg[0] != 0 && STRCASECMP(cur_record.msg, prv_record.msg) == 0); cur_record.cnt += cmp; cur_record.cnt *= cmp; if (cur_record.cnt >= log_filter_getRepeatLimit()) return; // sink the record into each registered sink for (log_sink_ptr fptr: sinks) { fptr(level, section, cur_record.msg); } if (cur_record.cnt > 0) return; memcpy(prv_record.msg, cur_record.msg, sizeof(cur_record.msg)); }
/// Eventually formats and routes the record to all sinks void log_backend_record(const char* section, int level, const char* fmt, va_list arguments) { const std::vector<log_sink_ptr>& sinks = log_formatter_getSinks(); if (sinks.empty()) { // no sinks are registered static bool warned = false; if (!warned) { fprintf(stderr, "\nWARNING: A log message was recorded, but no sink is registered." "\n (there will be no further warnings)\n\n"); warned = true; } } else { // format the record char* record = log_formatter_format(section, level, fmt, arguments); // sink the record std::vector<log_sink_ptr>::const_iterator si; for (si = sinks.begin(); si != sinks.end(); ++si) { (*si)(section, level, record); } delete[] record; } }