Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/gabime/spdlog.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgabime <gmelman1@gmail.com>2018-07-22 21:52:46 +0300
committergabime <gmelman1@gmail.com>2018-07-22 21:52:46 +0300
commit693103af9c5e9ba27d2ecb6a71d308bcc73d24ac (patch)
tree02a34f8de6e6bea442537b401f8a92b555b9a6cd /include
parent7184c423760b0ce533232d9ce76e20807d3af5f9 (diff)
support set_formatter in spdlog.h
Diffstat (limited to 'include')
-rw-r--r--include/spdlog/details/logger_impl.h15
-rw-r--r--include/spdlog/details/pattern_formatter.h35
-rw-r--r--include/spdlog/details/registry.h26
-rw-r--r--include/spdlog/formatter.h1
-rw-r--r--include/spdlog/logger.h19
-rw-r--r--include/spdlog/spdlog.h15
6 files changed, 60 insertions, 51 deletions
diff --git a/include/spdlog/details/logger_impl.h b/include/spdlog/details/logger_impl.h
index 4583e6d8..9330ac05 100644
--- a/include/spdlog/details/logger_impl.h
+++ b/include/spdlog/details/logger_impl.h
@@ -37,19 +37,18 @@ inline spdlog::logger::logger(std::string logger_name, spdlog::sink_ptr single_s
inline spdlog::logger::~logger() = default;
-template<typename FormatterT, typename... Args>
-inline void spdlog::logger::set_formatter(const Args &... args)
+
+inline void spdlog::logger::set_formatter(std::unique_ptr<spdlog::formatter> f)
{
- for (auto &sink : sinks_)
- {
- std::unique_ptr<FormatterT> formatter(new FormatterT(args...));
- sink->set_formatter(std::move(formatter));
- }
+ for (auto &sink : sinks_)
+ {
+ sink->set_formatter(f->clone());
+ }
}
inline void spdlog::logger::set_pattern(std::string pattern, pattern_time_type time_type)
{
- set_formatter<spdlog::pattern_formatter>(std::move(pattern), time_type);
+ set_formatter(std::unique_ptr<spdlog::formatter>(new pattern_formatter(std::move(pattern), time_type)));
}
template<typename... Args>
diff --git a/include/spdlog/details/pattern_formatter.h b/include/spdlog/details/pattern_formatter.h
index 06eee7f9..ad325743 100644
--- a/include/spdlog/details/pattern_formatter.h
+++ b/include/spdlog/details/pattern_formatter.h
@@ -541,18 +541,25 @@ private:
class pattern_formatter SPDLOG_FINAL : public formatter
{
public:
- explicit pattern_formatter(
- std::string pattern, pattern_time_type time_type = pattern_time_type::local, std::string eol = spdlog::details::os::default_eol)
- : eol_(std::move(eol))
- , pattern_time_type_(time_type)
- , last_log_secs_(0)
- {
- std::memset(&cached_tm_, 0, sizeof(cached_tm_));
- compile_pattern_(std::move(pattern));
- }
+ explicit pattern_formatter(
+ std::string pattern, pattern_time_type time_type = pattern_time_type::local, std::string eol = spdlog::details::os::default_eol)
+ : pattern_(std::move(pattern))
+ , eol_(std::move(eol))
+ , pattern_time_type_(time_type)
+ , last_log_secs_(0)
+ {
+ std::memset(&cached_tm_, 0, sizeof(cached_tm_));
+ compile_pattern_(pattern_);
+ }
+
+ pattern_formatter(const pattern_formatter &other) = delete;
+ pattern_formatter &operator=(const pattern_formatter &other) = delete;
+
+ virtual std::unique_ptr<formatter> clone() const override
+ {
+ return std::unique_ptr<formatter>(new pattern_formatter(pattern_, pattern_time_type_, eol_));
+ }
- pattern_formatter(const pattern_formatter &) = delete;
- pattern_formatter &operator=(const pattern_formatter &) = delete;
void format(const details::log_msg &msg, fmt::memory_buffer &dest) override
{
#ifndef SPDLOG_NO_DATETIME
@@ -572,7 +579,8 @@ public:
}
private:
- const std::string eol_;
+ std::string pattern_;
+ std::string eol_;
pattern_time_type pattern_time_type_;
std::tm cached_tm_;
std::chrono::seconds last_log_secs_;
@@ -734,9 +742,10 @@ private:
}
void compile_pattern_(const std::string &pattern)
- {
+ {
auto end = pattern.end();
std::unique_ptr<details::aggregate_formatter> user_chars;
+ formatters_.clear();
for (auto it = pattern.begin(); it != end; ++it)
{
if (*it == '%')
diff --git a/include/spdlog/details/registry.h b/include/spdlog/details/registry.h
index e07599fc..77f977f6 100644
--- a/include/spdlog/details/registry.h
+++ b/include/spdlog/details/registry.h
@@ -48,7 +48,7 @@ public:
throw_if_exists_(logger_name);
// set the global formatter pattern
- new_logger->set_formatter<pattern_formatter>(formatter_pattern_, pattern_time_type_);
+ new_logger->set_formatter(formatter_->clone());
if (err_handler_)
{
@@ -81,16 +81,17 @@ public:
return tp_;
}
- void set_pattern(const std::string &pattern, pattern_time_type time_type)
- {
- std::lock_guard<Mutex> lock(loggers_mutex_);
- formatter_pattern_ = pattern;
- pattern_time_type_ = time_type;
- for (auto &l : loggers_)
- {
- l.second->set_pattern(pattern, time_type);
- }
- }
+
+ // Set global formatter. Each sink in each logger will get a clone of this object
+ void set_formatter(std::unique_ptr<formatter> formatter)
+ {
+ std::lock_guard<Mutex> lock(loggers_mutex_);
+ formatter_ = std::move(formatter);
+ for (auto &l : loggers_)
+ {
+ l.second->set_formatter(formatter_->clone());
+ }
+ }
void set_level(level::level_enum log_level)
{
@@ -195,8 +196,7 @@ private:
Mutex loggers_mutex_;
std::recursive_mutex tp_mutex_;
std::unordered_map<std::string, std::shared_ptr<logger>> loggers_;
- std::string formatter_pattern_ = "%+";
- pattern_time_type pattern_time_type_ = pattern_time_type::local;
+ std::unique_ptr<formatter> formatter_{ new pattern_formatter("%+") };
level::level_enum level_ = level::info;
level::level_enum flush_level_ = level::off;
log_err_handler err_handler_;
diff --git a/include/spdlog/formatter.h b/include/spdlog/formatter.h
index 39d86524..afc6ee66 100644
--- a/include/spdlog/formatter.h
+++ b/include/spdlog/formatter.h
@@ -15,5 +15,6 @@ class formatter
public:
virtual ~formatter() = default;
virtual void format(const details::log_msg &msg, fmt::memory_buffer &dest) = 0;
+ virtual std::unique_ptr<formatter> clone() const = 0;
};
} // namespace spdlog
diff --git a/include/spdlog/logger.h b/include/spdlog/logger.h
index d7471b57..01be8cfc 100644
--- a/include/spdlog/logger.h
+++ b/include/spdlog/logger.h
@@ -114,24 +114,19 @@ public:
void set_level(level::level_enum log_level);
level::level_enum level() const;
const std::string &name() const;
-
- // create a pattern formatter all the sinks in this logger.
- // each sink gets itw own private copy of a formatter object.
- void set_pattern(std::string pattern, pattern_time_type time_type = pattern_time_type::local);
-
- // create a FormatterT formatter for each sink in this logger.
- // each sink gets its own private copy of a formatter object.
- template<typename FormatterT, typename... Args>
- void set_formatter(const Args &... args);
-
+
+ // set formatting for the sinks in this logger.
+ // each sink will get a seperate instance of the formatter object.
+ void set_formatter(std::unique_ptr<formatter> formatter);
+ void set_pattern(std::string pattern, pattern_time_type time_type = pattern_time_type::local);
+
void flush();
void flush_on(level::level_enum log_level);
const std::vector<sink_ptr> &sinks() const;
std::vector<sink_ptr> &sinks();
-
- // error handler
+
void set_error_handler(log_err_handler err_handler);
log_err_handler error_handler();
diff --git a/include/spdlog/spdlog.h b/include/spdlog/spdlog.h
index 0f9966d9..77f799b9 100644
--- a/include/spdlog/spdlog.h
+++ b/include/spdlog/spdlog.h
@@ -38,8 +38,7 @@ using default_factory = synchronous_factory;
// The logger's level, formatter and flush level will be set according the
// global settings.
// Example:
-// spdlog::create<daily_file_sink_st>("logger_name", "dailylog_filename", 11,
-// 59);
+// spdlog::create<daily_file_sink_st>("logger_name", "dailylog_filename", 11, 59);
template<typename Sink, typename... SinkArgs>
inline std::shared_ptr<spdlog::logger> create(std::string logger_name, SinkArgs &&... sink_args)
{
@@ -54,11 +53,17 @@ inline std::shared_ptr<logger> get(const std::string &name)
return details::registry::instance().get(name);
}
-// Set global formatting
+// Set global formatter. Each sink in each logger will get a clone of this object
+inline void set_formatter(std::unique_ptr<spdlog::formatter> formatter)
+{
+ details::registry::instance().set_formatter(std::move(formatter));
+}
+
+// Set global format string.
// example: spdlog::set_pattern("%Y-%m-%d %H:%M:%S.%e %l : %v");
-inline void set_pattern(std::string format_string, pattern_time_type time_type = pattern_time_type::local)
+inline void set_pattern(std::string pattern, pattern_time_type time_type = pattern_time_type::local)
{
- details::registry::instance().set_pattern(std::move(format_string), time_type);
+ set_formatter(std::unique_ptr<spdlog::formatter>(new pattern_formatter(pattern, time_type)));
}
// Set global logging level