13 #define SPDLOG_CATCH_AND_HANDLE \
14 catch (const std::exception &ex) \
16 err_handler_(ex.what()); \
20 err_handler_("Unknown exception in logger"); \
27 : name_(
std::move(logger_name))
40 :
logger(
std::move(logger_name), {std::move(single_sink)})
48 for (
auto &sink : sinks_)
50 sink->set_formatter(f->clone());
56 auto new_formatter = details::make_unique<spdlog::pattern_formatter>(std::move(pattern), time_type);
60 template<
typename... Args>
79 template<
typename... Args>
111 template<class T, typename std::enable_if<std::is_convertible<T, spdlog::string_view_t>::value, T>
::type *>
114 if (!should_log(lvl))
126 template<class T, typename std::enable_if<!std::is_convertible<T, spdlog::string_view_t>::value, T>
::type *>
129 if (!should_log(lvl))
138 details::log_msg log_msg(source, &name_, lvl,
to_string_view(buf));
144 template<
typename... Args>
150 template<
typename... Args>
156 template<
typename... Args>
162 template<
typename... Args>
168 template<
typename... Args>
174 template<
typename... Args>
216 #ifdef SPDLOG_WCHAR_TO_UTF8_SUPPORT
220 int wbuf_size = static_cast<int>(wbuf.
size());
226 auto result_size = ::WideCharToMultiByte(CP_UTF8, 0, wbuf.
data(), wbuf_size, NULL, 0, NULL, NULL);
230 target.
resize(result_size);
231 ::WideCharToMultiByte(CP_UTF8, 0, wbuf.
data(), wbuf_size, &target.
data()[0], result_size, NULL, NULL);
239 template<
typename... Args>
242 if (!should_log(lvl))
254 wbuf_to_utf8buf(wbuf, buf);
255 details::log_msg log_msg(source, &name_, lvl,
to_string_view(buf));
261 template<
typename... Args>
264 log(source_loc{}, lvl,
fmt, args...);
267 template<
typename... Args>
273 template<
typename... Args>
279 template<
typename... Args>
285 template<
typename... Args>
291 template<
typename... Args>
297 template<
typename... Args>
303 #endif // SPDLOG_WCHAR_TO_UTF8_SUPPORT
315 level_.store(log_level);
320 err_handler_ = std::move(err_handler);
339 flush_level_.store(log_level);
344 return static_cast<spdlog::level::level_enum>(flush_level_.load(std::memory_order_relaxed));
349 auto flush_level = flush_level_.load(std::memory_order_relaxed);
360 return static_cast<spdlog::level::level_enum>(level_.load(std::memory_order_relaxed));
365 return msg_level >= level_.load(std::memory_order_relaxed);
374 #if defined(SPDLOG_ENABLE_MESSAGE_COUNTER)
375 incr_msg_counter_(msg);
377 for (
auto &sink : sinks_)
379 if (sink->should_log(msg.
level))
385 if (should_flush_(msg))
393 for (
auto &sink : sinks_)
401 auto now = time(
nullptr);
402 if (
now - last_err_time_ < 60)
406 last_err_time_ =
now;
409 std::strftime(date_buf,
sizeof(date_buf),
"%Y-%m-%d %H:%M:%S", &tm_time);
410 fmt::print(stderr,
"[*** LOG ERROR ***] [{}] [{}] {}\n", date_buf, name(), msg);
415 msg.
msg_id = msg_counter_.fetch_add(1, std::memory_order_relaxed);
430 auto cloned = std::make_shared<spdlog::logger>(std::move(logger_name), sinks_.begin(), sinks_.end());
431 cloned->set_level(this->level());
432 cloned->flush_on(this->flush_level());
433 cloned->set_error_handler(this->error_handler());