Removed formatter_ member from the sink interface

This commit is contained in:
gabime 2019-06-27 23:56:37 +03:00
parent cf152e6030
commit 29f2eeea31
18 changed files with 49 additions and 45 deletions

View File

@ -16,6 +16,7 @@ template<typename ConsoleMutex>
SPDLOG_INLINE ansicolor_sink<ConsoleMutex>::ansicolor_sink(FILE *target_file, color_mode mode) SPDLOG_INLINE ansicolor_sink<ConsoleMutex>::ansicolor_sink(FILE *target_file, color_mode mode)
: target_file_(target_file) : target_file_(target_file)
, mutex_(ConsoleMutex::mutex()) , mutex_(ConsoleMutex::mutex())
, formatter_(details::make_unique<spdlog::pattern_formatter>())
{ {
set_color_mode(mode); set_color_mode(mode);

View File

@ -79,6 +79,7 @@ private:
FILE *target_file_; FILE *target_file_;
mutex_t &mutex_; mutex_t &mutex_;
bool should_do_colors_; bool should_do_colors_;
std::unique_ptr<spdlog::formatter> formatter_;
std::unordered_map<level::level_enum, string_view_t, level::level_hasher> colors_; std::unordered_map<level::level_enum, string_view_t, level::level_hasher> colors_;
void print_ccode_(const string_view_t &color_code); void print_ccode_(const string_view_t &color_code);
void print_range_(const fmt::memory_buffer &formatted, size_t start, size_t end); void print_range_(const fmt::memory_buffer &formatted, size_t start, size_t end);

View File

@ -10,6 +10,18 @@
#include "spdlog/common.h" #include "spdlog/common.h"
#include "spdlog/details/pattern_formatter.h" #include "spdlog/details/pattern_formatter.h"
#include <memory>
template<typename Mutex>
SPDLOG_INLINE spdlog::sinks::base_sink<Mutex>::base_sink()
: formatter_{details::make_unique<spdlog::pattern_formatter>()}
{}
template<typename Mutex>
SPDLOG_INLINE spdlog::sinks::base_sink<Mutex>::base_sink(std::unique_ptr<spdlog::formatter> formatter)
: formatter_{std::move(formatter)}
{}
template<typename Mutex> template<typename Mutex>
void SPDLOG_INLINE spdlog::sinks::base_sink<Mutex>::log(const details::log_msg &msg) void SPDLOG_INLINE spdlog::sinks::base_sink<Mutex>::log(const details::log_msg &msg)
{ {

View File

@ -19,7 +19,8 @@ template<typename Mutex>
class base_sink : public sink class base_sink : public sink
{ {
public: public:
base_sink() = default; base_sink();
explicit base_sink(std::unique_ptr<spdlog::formatter> formatter);
base_sink(const base_sink &) = delete; base_sink(const base_sink &) = delete;
base_sink &operator=(const base_sink &) = delete; base_sink &operator=(const base_sink &) = delete;
void log(const details::log_msg &msg) final; void log(const details::log_msg &msg) final;
@ -28,11 +29,14 @@ public:
void set_formatter(std::unique_ptr<spdlog::formatter> sink_formatter) final; void set_formatter(std::unique_ptr<spdlog::formatter> sink_formatter) final;
protected: protected:
// sink formatter
std::unique_ptr<spdlog::formatter> formatter_;
Mutex mutex_;
virtual void sink_it_(const details::log_msg &msg) = 0; virtual void sink_it_(const details::log_msg &msg) = 0;
virtual void flush_() = 0; virtual void flush_() = 0;
virtual void set_pattern_(const std::string &pattern); virtual void set_pattern_(const std::string &pattern);
virtual void set_formatter_(std::unique_ptr<spdlog::formatter> sink_formatter); virtual void set_formatter_(std::unique_ptr<spdlog::formatter> sink_formatter);
Mutex mutex_;
}; };
} // namespace sinks } // namespace sinks
} // namespace spdlog } // namespace spdlog

View File

@ -29,7 +29,7 @@ template<typename Mutex>
SPDLOG_INLINE void basic_file_sink<Mutex>::sink_it_(const details::log_msg &msg) SPDLOG_INLINE void basic_file_sink<Mutex>::sink_it_(const details::log_msg &msg)
{ {
fmt::memory_buffer formatted; fmt::memory_buffer formatted;
sink::formatter_->format(msg, formatted); base_sink<Mutex>::formatter_->format(msg, formatted);
file_helper_.write(formatted); file_helper_.write(formatted);
} }

View File

@ -74,7 +74,7 @@ protected:
rotation_tp_ = next_rotation_tp_(); rotation_tp_ = next_rotation_tp_();
} }
fmt::memory_buffer formatted; fmt::memory_buffer formatted;
sink::formatter_->format(msg, formatted); base_sink<Mutex>::formatter_->format(msg, formatted);
file_helper_.write(formatted); file_helper_.write(formatted);
} }

View File

@ -33,8 +33,6 @@
// [2019-06-25 17:50:56.512] [logger] [info] Skipped 3 duplicate messages.. // [2019-06-25 17:50:56.512] [logger] [info] Skipped 3 duplicate messages..
// [2019-06-25 17:50:56.512] [logger] [info] Different Hello // [2019-06-25 17:50:56.512] [logger] [info] Different Hello
namespace spdlog { namespace spdlog {
namespace sinks { namespace sinks {
template<typename Mutex> template<typename Mutex>
@ -55,14 +53,14 @@ protected:
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;
return; return;
} }
// log the "skipped.." message // log the "skipped.." message
if(skip_counter_ > 0) if (skip_counter_ > 0)
{ {
fmt::basic_memory_buffer<char, 64> buf; fmt::basic_memory_buffer<char, 64> buf;
fmt::format_to(buf, "Skipped {} duplicate messages..", skip_counter_); fmt::format_to(buf, "Skipped {} duplicate messages..", skip_counter_);
@ -72,7 +70,7 @@ protected:
// log current message // log current message
dist_sink<Mutex>::sink_it_(msg); dist_sink<Mutex>::sink_it_(msg);
last_msg_time_= msg.time; last_msg_time_ = msg.time;
skip_counter_ = 0; skip_counter_ = 0;
last_msg_payload_.assign(msg.payload.data(), msg.payload.data() + msg.payload.size()); last_msg_payload_.assign(msg.payload.data(), msg.payload.data() + msg.payload.size());
} }
@ -81,7 +79,7 @@ protected:
bool filter_(const details::log_msg &msg) bool filter_(const details::log_msg &msg)
{ {
auto filter_duration = msg.time - last_msg_time_; auto filter_duration = msg.time - last_msg_time_;
return (filter_duration > max_skip_duration_) || (msg.payload != last_msg_payload_); return (filter_duration > max_skip_duration_) || (msg.payload != last_msg_payload_);
} }
}; };

View File

@ -29,7 +29,7 @@ protected:
{ {
fmt::memory_buffer formatted; fmt::memory_buffer formatted;
sink::formatter_->format(msg, formatted); base_sink<Mutex>::formatter_->format(msg, formatted);
OutputDebugStringA(fmt::to_string(formatted).c_str()); OutputDebugStringA(fmt::to_string(formatted).c_str());
} }

View File

@ -26,7 +26,7 @@ protected:
void sink_it_(const details::log_msg &msg) override void sink_it_(const details::log_msg &msg) override
{ {
fmt::memory_buffer formatted; fmt::memory_buffer formatted;
sink::formatter_->format(msg, formatted); base_sink<Mutex>::formatter_->format(msg, formatted);
ostream_.write(formatted.data(), static_cast<std::streamsize>(formatted.size())); ostream_.write(formatted.data(), static_cast<std::streamsize>(formatted.size()));
if (force_flush_) if (force_flush_)
{ {

View File

@ -67,7 +67,7 @@ template<typename Mutex>
SPDLOG_INLINE void rotating_file_sink<Mutex>::sink_it_(const details::log_msg &msg) SPDLOG_INLINE void rotating_file_sink<Mutex>::sink_it_(const details::log_msg &msg)
{ {
fmt::memory_buffer formatted; fmt::memory_buffer formatted;
sink::formatter_->format(msg, formatted); base_sink<Mutex>::formatter_->format(msg, formatted);
current_size_ += formatted.size(); current_size_ += formatted.size();
if (current_size_ > max_size_) if (current_size_ > max_size_)
{ {

View File

@ -10,14 +10,6 @@
#include "spdlog/common.h" #include "spdlog/common.h"
#include "spdlog/details/pattern_formatter.h" #include "spdlog/details/pattern_formatter.h"
SPDLOG_INLINE spdlog::sinks::sink::sink()
: formatter_{details::make_unique<spdlog::pattern_formatter>()}
{}
SPDLOG_INLINE spdlog::sinks::sink::sink(std::unique_ptr<spdlog::formatter> formatter)
: formatter_{std::move(formatter)}
{}
SPDLOG_INLINE bool spdlog::sinks::sink::should_log(spdlog::level::level_enum msg_level) const SPDLOG_INLINE bool spdlog::sinks::sink::should_log(spdlog::level::level_enum msg_level) const
{ {
return msg_level >= level_.load(std::memory_order_relaxed); return msg_level >= level_.load(std::memory_order_relaxed);
@ -25,7 +17,7 @@ SPDLOG_INLINE bool spdlog::sinks::sink::should_log(spdlog::level::level_enum msg
SPDLOG_INLINE void spdlog::sinks::sink::set_level(level::level_enum log_level) SPDLOG_INLINE void spdlog::sinks::sink::set_level(level::level_enum log_level)
{ {
level_.store(log_level); level_.store(log_level, std::memory_order_relaxed);
} }
SPDLOG_INLINE spdlog::level::level_enum spdlog::sinks::sink::level() const SPDLOG_INLINE spdlog::level::level_enum spdlog::sinks::sink::level() const

View File

@ -12,27 +12,19 @@ namespace sinks {
class sink class sink
{ {
public: public:
sink();
explicit sink(std::unique_ptr<spdlog::formatter> formatter);
virtual ~sink() = default; virtual ~sink() = default;
virtual void log(const details::log_msg &msg) = 0; virtual void log(const details::log_msg &msg) = 0;
virtual void flush() = 0; virtual void flush() = 0;
virtual void set_pattern(const std::string &pattern) = 0; virtual void set_pattern(const std::string &pattern) = 0;
virtual void set_formatter(std::unique_ptr<spdlog::formatter> sink_formatter) = 0; virtual void set_formatter(std::unique_ptr<spdlog::formatter> sink_formatter) = 0;
bool should_log(level::level_enum msg_level) const;
void set_level(level::level_enum log_level); void set_level(level::level_enum log_level);
level::level_enum level() const; level::level_enum level() const;
bool should_log(level::level_enum msg_level) const;
protected: protected:
// sink log level - default is all // sink log level - default is all
level_t level_{level::trace}; level_t level_{level::trace};
// sink formatter
std::unique_ptr<spdlog::formatter> formatter_;
}; };
} // namespace sinks } // namespace sinks

View File

@ -18,6 +18,7 @@ template<typename ConsoleMutex>
SPDLOG_INLINE stdout_sink_base<ConsoleMutex>::stdout_sink_base(FILE *file) SPDLOG_INLINE stdout_sink_base<ConsoleMutex>::stdout_sink_base(FILE *file)
: mutex_(ConsoleMutex::mutex()) : mutex_(ConsoleMutex::mutex())
, file_(file) , file_(file)
, formatter_(details::make_unique<spdlog::pattern_formatter>())
{} {}
template<typename ConsoleMutex> template<typename ConsoleMutex>

View File

@ -28,9 +28,10 @@ public:
void set_formatter(std::unique_ptr<spdlog::formatter> sink_formatter) override; void set_formatter(std::unique_ptr<spdlog::formatter> sink_formatter) override;
private: protected:
mutex_t &mutex_; mutex_t &mutex_;
FILE *file_; FILE *file_;
std::unique_ptr<spdlog::formatter> formatter_;
}; };
template<typename ConsoleMutex> template<typename ConsoleMutex>

View File

@ -52,7 +52,7 @@ protected:
if (enable_formatting_) if (enable_formatting_)
{ {
fmt::memory_buffer formatted; fmt::memory_buffer formatted;
sink::formatter_->format(msg, formatted); base_sink<Mutex>::formatter_->format(msg, formatted);
payload = string_view_t(formatted.data(), formatted.size()); payload = string_view_t(formatted.data(), formatted.size());
} }
else else

View File

@ -8,14 +8,17 @@
#endif #endif
#include "spdlog/common.h" #include "spdlog/common.h"
#include "spdlog/details/pattern_formatter.h"
namespace spdlog { namespace spdlog {
namespace sinks { namespace sinks {
template<typename ConsoleMutex> template<typename ConsoleMutex>
SPDLOG_INLINE wincolor_sink<ConsoleMutex>::wincolor_sink(HANDLE out_handle, color_mode mode) SPDLOG_INLINE wincolor_sink<ConsoleMutex>::wincolor_sink(HANDLE out_handle, color_mode mode)
: out_handle_(out_handle) :
, out_handle_(out_handle)
, mutex_(ConsoleMutex::mutex()) , mutex_(ConsoleMutex::mutex())
, formatter_(details::make_unique<spdlog::pattern_formatter>())
{ {
set_color_mode(mode); set_color_mode(mode);
colors_[level::trace] = WHITE; colors_[level::trace] = WHITE;

View File

@ -45,11 +45,12 @@ public:
void set_formatter(std::unique_ptr<spdlog::formatter> sink_formatter) override final; void set_formatter(std::unique_ptr<spdlog::formatter> sink_formatter) override final;
void set_color_mode(color_mode mode); void set_color_mode(color_mode mode);
private: protected:
using mutex_t = typename ConsoleMutex::mutex_t; using mutex_t = typename ConsoleMutex::mutex_t;
HANDLE out_handle_; HANDLE out_handle_;
mutex_t &mutex_; mutex_t &mutex_;
bool should_do_colors_; bool should_do_colors_;
std::unique_ptr<spdlog::formatter> formatter_;
std::unordered_map<level::level_enum, WORD, level::level_hasher> colors_; std::unordered_map<level::level_enum, WORD, level::level_hasher> colors_;
// set color and return the orig console attributes (for resetting later) // set color and return the orig console attributes (for resetting later)

View File

@ -5,14 +5,13 @@
using namespace spdlog; using namespace spdlog;
using namespace spdlog::sinks; using namespace spdlog::sinks;
TEST_CASE("dup_filter_test1", "[dup_filter_sink]") TEST_CASE("dup_filter_test1", "[dup_filter_sink]")
{ {
dup_filter_sink_st dup_sink {std::chrono::seconds{5}}; dup_filter_sink_st dup_sink{std::chrono::seconds{5}};
auto test_sink = std::make_shared<test_sink_mt>(); auto test_sink = std::make_shared<test_sink_mt>();
dup_sink.add_sink(test_sink); dup_sink.add_sink(test_sink);
for(int i = 0; i < 10; i++) for (int i = 0; i < 10; i++)
{ {
dup_sink.log(spdlog::details::log_msg{"test", spdlog::level::info, "message1"}); dup_sink.log(spdlog::details::log_msg{"test", spdlog::level::info, "message1"});
} }
@ -22,11 +21,11 @@ TEST_CASE("dup_filter_test1", "[dup_filter_sink]")
TEST_CASE("dup_filter_test2", "[dup_filter_sink]") TEST_CASE("dup_filter_test2", "[dup_filter_sink]")
{ {
dup_filter_sink_st dup_sink {std::chrono::seconds{0}}; dup_filter_sink_st dup_sink{std::chrono::seconds{0}};
auto test_sink = std::make_shared<test_sink_mt>(); auto test_sink = std::make_shared<test_sink_mt>();
dup_sink.add_sink(test_sink); dup_sink.add_sink(test_sink);
for(int i = 0; i < 10; i++) for (int i = 0; i < 10; i++)
{ {
dup_sink.log(spdlog::details::log_msg{"test", spdlog::level::info, "message1"}); dup_sink.log(spdlog::details::log_msg{"test", spdlog::level::info, "message1"});
} }
@ -36,11 +35,11 @@ TEST_CASE("dup_filter_test2", "[dup_filter_sink]")
TEST_CASE("dup_filter_test3", "[dup_filter_sink]") TEST_CASE("dup_filter_test3", "[dup_filter_sink]")
{ {
dup_filter_sink_st dup_sink {std::chrono::seconds{0}}; dup_filter_sink_st dup_sink{std::chrono::seconds{0}};
auto test_sink = std::make_shared<test_sink_mt>(); auto test_sink = std::make_shared<test_sink_mt>();
dup_sink.add_sink(test_sink); dup_sink.add_sink(test_sink);
for(int i = 0; i < 10; i++) for (int i = 0; i < 10; i++)
{ {
dup_sink.log(spdlog::details::log_msg{"test", spdlog::level::info, "message1"}); dup_sink.log(spdlog::details::log_msg{"test", spdlog::level::info, "message1"});
dup_sink.log(spdlog::details::log_msg{"test", spdlog::level::info, "message2"}); dup_sink.log(spdlog::details::log_msg{"test", spdlog::level::info, "message2"});
@ -51,7 +50,7 @@ TEST_CASE("dup_filter_test3", "[dup_filter_sink]")
TEST_CASE("dup_filter_test4", "[dup_filter_sink]") TEST_CASE("dup_filter_test4", "[dup_filter_sink]")
{ {
dup_filter_sink_mt dup_sink {std::chrono::milliseconds{10}}; dup_filter_sink_mt dup_sink{std::chrono::milliseconds{10}};
auto test_sink = std::make_shared<test_sink_mt>(); auto test_sink = std::make_shared<test_sink_mt>();
dup_sink.add_sink(test_sink); dup_sink.add_sink(test_sink);
@ -63,7 +62,7 @@ TEST_CASE("dup_filter_test4", "[dup_filter_sink]")
TEST_CASE("dup_filter_test5", "[dup_filter_sink]") TEST_CASE("dup_filter_test5", "[dup_filter_sink]")
{ {
dup_filter_sink_mt dup_sink {std::chrono::seconds{5}}; dup_filter_sink_mt dup_sink{std::chrono::seconds{5}};
auto test_sink = std::make_shared<test_sink_mt>(); auto test_sink = std::make_shared<test_sink_mt>();
dup_sink.add_sink(test_sink); dup_sink.add_sink(test_sink);
@ -74,4 +73,3 @@ TEST_CASE("dup_filter_test5", "[dup_filter_sink]")
REQUIRE(test_sink->msg_counter() == 3); // skip 2 messages but log the "skipped.." message before message2 REQUIRE(test_sink->msg_counter() == 3); // skip 2 messages but log the "skipped.." message before message2
} }