diff --git a/include/spdlog/details/log_msg-inl.h b/include/spdlog/details/log_msg-inl.h index 0a0aed81..76e854b7 100644 --- a/include/spdlog/details/log_msg-inl.h +++ b/include/spdlog/details/log_msg-inl.h @@ -12,6 +12,18 @@ namespace spdlog { namespace details { +SPDLOG_INLINE log_msg::log_msg( + spdlog::log_clock::time_point &log_time, spdlog::source_loc loc, string_view_t a_logger_name, spdlog::level::level_enum lvl, spdlog::string_view_t msg) + : logger_name(a_logger_name) + , level(lvl) + , time(log_time) +#ifndef SPDLOG_NO_THREAD_ID + , thread_id(os::thread_id()) +#endif + , source(loc) + , payload(msg) +{} + SPDLOG_INLINE log_msg::log_msg( spdlog::source_loc loc, string_view_t a_logger_name, spdlog::level::level_enum lvl, spdlog::string_view_t msg) : logger_name(a_logger_name) diff --git a/include/spdlog/details/log_msg.h b/include/spdlog/details/log_msg.h index 03bdbaec..f7aea7c8 100644 --- a/include/spdlog/details/log_msg.h +++ b/include/spdlog/details/log_msg.h @@ -11,6 +11,7 @@ namespace details { struct SPDLOG_API log_msg { log_msg() = default; + log_msg(log_clock::time_point &log_time, source_loc loc, string_view_t logger_name, level::level_enum lvl, string_view_t msg); log_msg(source_loc loc, string_view_t logger_name, level::level_enum lvl, string_view_t msg); log_msg(string_view_t logger_name, level::level_enum lvl, string_view_t msg); log_msg(const log_msg &other) = default; diff --git a/include/spdlog/logger.h b/include/spdlog/logger.h index aeb38564..96abec97 100644 --- a/include/spdlog/logger.h +++ b/include/spdlog/logger.h @@ -73,6 +73,25 @@ public: void swap(spdlog::logger &other) SPDLOG_NOEXCEPT; + template + void log(log_clock::time_point &log_time, source_loc loc, level::level_enum lvl, string_view_t fmt, const Args &... args) + { + bool log_enabled = should_log(lvl); + bool traceback_enabled = tracer_.enabled(); + if (!log_enabled && !traceback_enabled) + { + return; + } + SPDLOG_TRY + { + memory_buf_t buf; + fmt::format_to(buf, fmt, args...); + details::log_msg log_msg(log_time, loc, name_, lvl, string_view_t(buf.data(), buf.size())); + log_it_(log_msg, log_enabled, traceback_enabled); + } + SPDLOG_LOGGER_CATCH() + } + template void log(source_loc loc, level::level_enum lvl, string_view_t fmt, const Args &... args) { @@ -140,6 +159,13 @@ public: log(source_loc{}, lvl, msg); } + // T can be statically converted to string_view + template::value, T>::type * = nullptr> + void log(log_clock::time_point &log_time, source_loc loc, level::level_enum lvl, const T &msg) + { + log(log_time, loc, lvl, string_view_t{msg}); + } + // T can be statically converted to string_view template::value, T>::type * = nullptr> void log(source_loc loc, level::level_enum lvl, const T &msg) @@ -147,6 +173,19 @@ public: log(loc, lvl, string_view_t{msg}); } + void log(log_clock::time_point &log_time, source_loc loc, level::level_enum lvl, string_view_t msg) + { + bool log_enabled = should_log(lvl); + bool traceback_enabled = tracer_.enabled(); + if (!log_enabled && !traceback_enabled) + { + return; + } + + details::log_msg log_msg(log_time, loc, name_, lvl, msg); + log_it_(log_msg, log_enabled, traceback_enabled); + } + void log(source_loc loc, level::level_enum lvl, string_view_t msg) { bool log_enabled = should_log(lvl); @@ -165,6 +204,15 @@ public: log(source_loc{}, lvl, msg); } + // T cannot be statically converted to string_view or wstring_view + template::value && + !is_convertible_to_wstring_view::value, + T>::type * = nullptr> + void log(log_clock::time_point &log_time, source_loc loc, level::level_enum lvl, const T &msg) + { + log(log_time, loc, lvl, "{}", msg); + } + // T cannot be statically converted to string_view or wstring_view template::value && !is_convertible_to_wstring_view::value, @@ -215,6 +263,29 @@ public: #error SPDLOG_WCHAR_TO_UTF8_SUPPORT only supported on windows #else + template + void log(log_clock::time_point &log_time, source_loc loc, level::level_enum lvl, wstring_view_t fmt, const Args &... args) + { + bool log_enabled = should_log(lvl); + bool traceback_enabled = tracer_.enabled(); + if (!log_enabled && !traceback_enabled) + { + return; + } + SPDLOG_TRY + { + // format to wmemory_buffer and convert to utf8 + fmt::wmemory_buffer wbuf; + fmt::format_to(wbuf, fmt, args...); + + memory_buf_t buf; + details::os::wstr_to_utf8buf(wstring_view_t(wbuf.data(), wbuf.size()), buf); + details::log_msg log_msg(log_time, loc, name_, lvl, string_view_t(buf.data(), buf.size())); + log_it_(log_msg, log_enabled, traceback_enabled); + } + SPDLOG_LOGGER_CATCH() + } + template void log(source_loc loc, level::level_enum lvl, wstring_view_t fmt, const Args &... args) { @@ -280,6 +351,27 @@ public: log(level::critical, fmt, args...); } + // T can be statically converted to wstring_view + template::value, T>::type * = nullptr> + void log(log_clock::time_point &log_time, source_loc loc, level::level_enum lvl, const T &msg) + { + bool log_enabled = should_log(lvl); + bool traceback_enabled = tracer_.enabled(); + if (!log_enabled && !traceback_enabled) + { + return; + } + + SPDLOG_TRY + { + memory_buf_t buf; + details::os::wstr_to_utf8buf(msg, buf); + details::log_msg log_msg(log_time, loc, name_, lvl, string_view_t(buf.data(), buf.size())); + log_it_(log_msg, log_enabled, traceback_enabled); + } + SPDLOG_LOGGER_CATCH() + } + // T can be statically converted to wstring_view template::value, T>::type * = nullptr> void log(source_loc loc, level::level_enum lvl, const T &msg)