Пример #1
0
// 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));
}
Пример #2
0
/// 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;
	}
}