Photon 1.0.0
Loading...
Searching...
No Matches
dup_filter_sink.h
Go to the documentation of this file.
1// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
2// Distributed under the MIT License (http://opensource.org/licenses/MIT)
3
4#pragma once
5
6#include "dist_sink.h"
9
10#include <cstdio>
11#include <mutex>
12#include <string>
13#include <chrono>
14
15// Duplicate message removal sink.
16// Skip the message if previous one is identical and less than "max_skip_duration" have passed
17//
18// Example:
19//
20// #include <spdlog/sinks/dup_filter_sink.h>
21//
22// int main() {
23// auto dup_filter = std::make_shared<dup_filter_sink_st>(std::chrono::seconds(5), level::info);
24// dup_filter->add_sink(std::make_shared<stdout_color_sink_mt>());
25// spdlog::logger l("logger", dup_filter);
26// l.info("Hello");
27// l.info("Hello");
28// l.info("Hello");
29// l.info("Different Hello");
30// }
31//
32// Will produce:
33// [2019-06-25 17:50:56.511] [logger] [info] Hello
34// [2019-06-25 17:50:56.512] [logger] [info] Skipped 3 duplicate messages..
35// [2019-06-25 17:50:56.512] [logger] [info] Different Hello
36
37namespace spdlog
38{
39 namespace sinks
40 {
41 template <typename Mutex>
42 class dup_filter_sink : public dist_sink<Mutex>
43 {
44 public:
45 template <class Rep, class Period>
46 explicit dup_filter_sink(std::chrono::duration<Rep, Period> max_skip_duration, level::level_enum notification_level = level::info)
47 : max_skip_duration_{max_skip_duration}, log_level_{notification_level}
48 {
49 }
50
51 protected:
52 std::chrono::microseconds max_skip_duration_;
53 log_clock::time_point last_msg_time_;
54 std::string last_msg_payload_;
55 size_t skip_counter_ = 0;
57
58 void sink_it_(const details::log_msg& msg) override
59 {
60 bool filtered = filter_(msg);
61 if (!filtered)
62 {
63 skip_counter_ += 1;
64 return;
65 }
66
67 // log the "skipped.." message
68 if (skip_counter_ > 0)
69 {
70 char buf[64];
71 auto msg_size = ::snprintf(buf, sizeof(buf), "Skipped %u duplicate messages..", static_cast<unsigned>(skip_counter_));
72 if (msg_size > 0 && static_cast<size_t>(msg_size) < sizeof(buf))
73 {
74 details::log_msg skipped_msg{msg.source, msg.logger_name, log_level_, string_view_t{buf, static_cast<size_t>(msg_size)}};
75 dist_sink<Mutex>::sink_it_(skipped_msg);
76 }
77 }
78
79 // log current message
81 last_msg_time_ = msg.time;
82 skip_counter_ = 0;
83 last_msg_payload_.assign(msg.payload.data(), msg.payload.data() + msg.payload.size());
84 }
85
86 // return whether the log msg should be displayed (true) or skipped (false)
87 bool filter_(const details::log_msg& msg)
88 {
89 auto filter_duration = msg.time - last_msg_time_;
90 return (filter_duration > max_skip_duration_) || (msg.payload != last_msg_payload_);
91 }
92 };
93
96
97 } // namespace sinks
98} // namespace spdlog
Definition dist_sink.h:26
void sink_it_(const details::log_msg &msg) override
Definition dist_sink.h:61
Definition dup_filter_sink.h:43
bool filter_(const details::log_msg &msg)
Definition dup_filter_sink.h:87
log_clock::time_point last_msg_time_
Definition dup_filter_sink.h:53
std::string last_msg_payload_
Definition dup_filter_sink.h:54
std::chrono::microseconds max_skip_duration_
Definition dup_filter_sink.h:52
level::level_enum log_level_
Definition dup_filter_sink.h:56
size_t skip_counter_
Definition dup_filter_sink.h:55
void sink_it_(const details::log_msg &msg) override
Definition dup_filter_sink.h:58
dup_filter_sink(std::chrono::duration< Rep, Period > max_skip_duration, level::level_enum notification_level=level::info)
Definition dup_filter_sink.h:46
level_enum
Definition common.h:233
@ info
Definition common.h:236
dup_filter_sink< details::null_mutex > dup_filter_sink_st
Definition dup_filter_sink.h:95
dup_filter_sink< std::mutex > dup_filter_sink_mt
Definition dup_filter_sink.h:94
Definition async.h:26
fmt::basic_string_view< char > string_view_t
Definition common.h:172
Definition log_msg.h:14
log_clock::time_point time
Definition log_msg.h:24
string_view_t payload
Definition log_msg.h:32
source_loc source
Definition log_msg.h:31
string_view_t logger_name
Definition log_msg.h:22