diff --git a/include/spdlog/sinks/daily_file_sink.h b/include/spdlog/sinks/daily_file_sink.h index f6f1bb1d..90af9676 100644 --- a/include/spdlog/sinks/daily_file_sink.h +++ b/include/spdlog/sinks/daily_file_sink.h @@ -13,6 +13,9 @@ #include #include +#include +#include +#include #include #include #include @@ -46,46 +49,15 @@ struct daily_filename_calculator */ struct daily_filename_format_calculator { - static filename_t calc_filename(const filename_t &filename, const tm &now_tm) + static filename_t calc_filename(const filename_t &file_path, const tm &now_tm) { -#ifdef SPDLOG_USE_STD_FORMAT - // adapted from fmtlib: https://github.com/fmtlib/fmt/blob/8.0.1/include/fmt/chrono.h#L522-L546 - - filename_t tm_format; - tm_format.append(filename); - // By appending an extra space we can distinguish an empty result that - // indicates insufficient buffer size from a guaranteed non-empty result - // https://github.com/fmtlib/fmt/issues/2238 - tm_format.push_back(' '); - - const size_t MIN_SIZE = 10; - filename_t buf; - buf.resize(MIN_SIZE); - for (;;) - { - size_t count = strftime(buf.data(), buf.size(), tm_format.c_str(), &now_tm); - if (count != 0) - { - // Remove the extra space. - buf.resize(count - 1); - break; - } - buf.resize(buf.size() * 2); - } - - return buf; +#if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES) + std::wstringstream stream; #else - // generate fmt datetime format string, e.g. {:%Y-%m-%d}. - filename_t fmt_filename = fmt::format(SPDLOG_FMT_STRING(SPDLOG_FILENAME_T("{{:{}}}")), filename); - - // MSVC doesn't allow fmt::runtime(..) with wchar, with fmtlib versions < 9.1.x -# if defined(_MSC_VER) && defined(SPDLOG_WCHAR_FILENAMES) && FMT_VERSION < 90101 - return fmt::format(fmt_filename, now_tm); -# else - return fmt::format(SPDLOG_FMT_RUNTIME(fmt_filename), now_tm); -# endif - + std::stringstream stream; #endif + stream << std::put_time(&now_tm, file_path.c_str()); + return stream.str(); } private: diff --git a/include/spdlog/logger.h b/include/spdlog/logger.h index 71544e84..1d802f32 100644 --- a/include/spdlog/logger.h +++ b/include/spdlog/logger.h @@ -369,9 +369,9 @@ protected: { memory_buf_t buf; #ifdef SPDLOG_USE_STD_FORMAT - fmt_lib::vformat_to(std::back_inserter(buf), fmt, fmt_lib::make_format_args(std::forward(args)...)); + fmt_lib::vformat_to(std::back_inserter(buf), fmt, fmt_lib::make_format_args(args...)); #else - fmt::vformat_to(fmt::appender(buf), fmt, fmt::make_format_args(std::forward(args)...)); + fmt::vformat_to(fmt::appender(buf), fmt, fmt::make_format_args(args...)); #endif details::log_msg log_msg(loc, name_, lvl, string_view_t(buf.data(), buf.size())); @@ -395,10 +395,9 @@ protected: // format to wmemory_buffer and convert to utf8 wmemory_buf_t wbuf; # ifdef SPDLOG_USE_STD_FORMAT - fmt_lib::vformat_to( - std::back_inserter(wbuf), fmt, fmt_lib::make_format_args(std::forward(args)...)); + fmt_lib::vformat_to(std::back_inserter(wbuf), fmt, fmt_lib::make_format_args(args...)); # else - fmt::vformat_to(std::back_inserter(wbuf), fmt, fmt::make_format_args(std::forward(args)...)); + fmt::vformat_to(std::back_inserter(wbuf), fmt, fmt::make_format_args(args...)); # endif memory_buf_t buf; diff --git a/include/spdlog/common.h b/include/spdlog/common.h index e69201a8..5f671c5c 100644 --- a/include/spdlog/common.h +++ b/include/spdlog/common.h @@ -173,12 +173,19 @@ using format_string_t = fmt::format_string; template using remove_cvref_t = typename std::remove_cv::type>::type; +template +#if FMT_VERSION >= 90101 +using fmt_runtime_string = fmt::runtime_format_string; +#else +using fmt_runtime_string = fmt::basic_runtime; +#endif + // clang doesn't like SFINAE disabled constructor in std::is_convertible<> so have to repeat the condition from basic_format_string here, // in addition, fmt::basic_runtime is only convertible to basic_format_string but not basic_string_view template struct is_convertible_to_basic_format_string : std::integral_constant>::value || std::is_same, fmt::basic_runtime>::value> + std::is_convertible>::value || std::is_same, fmt_runtime_string>::value> {}; # if defined(SPDLOG_WCHAR_FILENAMES) || defined(SPDLOG_WCHAR_TO_UTF8_SUPPORT)