예제 #1
0
파일: Backend.cpp 프로젝트: nixtux/spring
// 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;
	}
}
예제 #3
0
void log_backend_unregisterSink(log_sink_ptr sink) {

	std::vector<log_sink_ptr>& sinks = log_formatter_getSinks();
	std::vector<log_sink_ptr>::iterator si;
	for (si = sinks.begin(); si != sinks.end(); ++si) {
		if (*si == sink) {
			sinks.erase(si);
			break;
		}
	}
}
예제 #4
0
파일: Backend.cpp 프로젝트: nixtux/spring
void log_backend_unregisterSink(log_sink_ptr sink) { log_formatter_getSinks().erase(sink); }
예제 #5
0
파일: Backend.cpp 프로젝트: nixtux/spring
void log_backend_registerSink(log_sink_ptr sink) { log_formatter_getSinks().insert(sink); }
예제 #6
0
void log_backend_registerSink(log_sink_ptr sink) {
	log_formatter_getSinks().push_back(sink);
}