mirror of
https://github.com/gabime/spdlog.git
synced 2025-11-16 09:28:56 +08:00
support set_formatter in spdlog.h
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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 == '%')
|
||||
|
||||
@@ -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_;
|
||||
|
||||
Reference in New Issue
Block a user