|
|
@ -40,22 +40,21 @@ template <typename Mutex>
|
|
|
|
class dup_filter_sink : public dist_sink<Mutex> {
|
|
|
|
class dup_filter_sink : public dist_sink<Mutex> {
|
|
|
|
public:
|
|
|
|
public:
|
|
|
|
template <class Rep, class Period>
|
|
|
|
template <class Rep, class Period>
|
|
|
|
explicit dup_filter_sink(std::chrono::duration<Rep, Period> max_skip_duration,
|
|
|
|
explicit dup_filter_sink(std::chrono::duration<Rep, Period> max_skip_duration)
|
|
|
|
level::level_enum notification_level = level::info)
|
|
|
|
: max_skip_duration_{max_skip_duration} {}
|
|
|
|
: max_skip_duration_{max_skip_duration},
|
|
|
|
|
|
|
|
log_level_{notification_level} {}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
protected:
|
|
|
|
std::chrono::microseconds max_skip_duration_;
|
|
|
|
std::chrono::microseconds max_skip_duration_;
|
|
|
|
log_clock::time_point last_msg_time_;
|
|
|
|
log_clock::time_point last_msg_time_;
|
|
|
|
std::string last_msg_payload_;
|
|
|
|
std::string last_msg_payload_;
|
|
|
|
size_t skip_counter_ = 0;
|
|
|
|
size_t skip_counter_ = 0;
|
|
|
|
level::level_enum log_level_;
|
|
|
|
level::level_enum skipped_msg_log_level_ = spdlog::level::level_enum::off;
|
|
|
|
|
|
|
|
|
|
|
|
void sink_it_(const details::log_msg &msg) override {
|
|
|
|
void sink_it_(const details::log_msg &msg) override {
|
|
|
|
bool filtered = filter_(msg);
|
|
|
|
bool filtered = filter_(msg);
|
|
|
|
if (!filtered) {
|
|
|
|
if (!filtered) {
|
|
|
|
skip_counter_ += 1;
|
|
|
|
skip_counter_ += 1;
|
|
|
|
|
|
|
|
skipped_msg_log_level_ = msg.level;
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -65,7 +64,7 @@ protected:
|
|
|
|
auto msg_size = ::snprintf(buf, sizeof(buf), "Skipped %u duplicate messages..",
|
|
|
|
auto msg_size = ::snprintf(buf, sizeof(buf), "Skipped %u duplicate messages..",
|
|
|
|
static_cast<unsigned>(skip_counter_));
|
|
|
|
static_cast<unsigned>(skip_counter_));
|
|
|
|
if (msg_size > 0 && static_cast<size_t>(msg_size) < sizeof(buf)) {
|
|
|
|
if (msg_size > 0 && static_cast<size_t>(msg_size) < sizeof(buf)) {
|
|
|
|
details::log_msg skipped_msg{msg.source, msg.logger_name, log_level_,
|
|
|
|
details::log_msg skipped_msg{msg.source, msg.logger_name, skipped_msg_log_level_,
|
|
|
|
string_view_t{buf, static_cast<size_t>(msg_size)}};
|
|
|
|
string_view_t{buf, static_cast<size_t>(msg_size)}};
|
|
|
|
dist_sink<Mutex>::sink_it_(skipped_msg);
|
|
|
|
dist_sink<Mutex>::sink_it_(skipped_msg);
|
|
|
|
}
|
|
|
|
}
|
|
|
|