diff --git a/include/spdlog/logger-inl.h b/include/spdlog/logger-inl.h index 5218fe4c..3858105e 100644 --- a/include/spdlog/logger-inl.h +++ b/include/spdlog/logger-inl.h @@ -171,28 +171,20 @@ SPDLOG_INLINE bool logger::should_flush_(const details::log_msg &msg) { SPDLOG_INLINE void logger::err_handler_(const std::string &msg) { if (custom_err_handler_) { custom_err_handler_(msg); - } else { + } else { using std::chrono::system_clock; - static std::mutex mutex; - static std::chrono::system_clock::time_point last_report_time; - static size_t err_counter = 0; - std::lock_guard lk{mutex}; auto now = system_clock::now(); - err_counter++; - if (now - last_report_time < std::chrono::seconds(1)) { - return; - } - last_report_time = now; + auto err_counter_val = err_counter.fetch_add(1, std::memory_order_relaxed)+1; auto tm_time = details::os::localtime(system_clock::to_time_t(now)); char date_buf[64]; std::strftime(date_buf, sizeof(date_buf), "%Y-%m-%d %H:%M:%S", &tm_time); -#if defined(USING_R) && defined(R_R_H) // if in R environment - REprintf("[*** LOG ERROR #%04zu ***] [%s] [%s] %s\n", err_counter, date_buf, name().c_str(), - msg.c_str()); -#else - std::fprintf(stderr, "[*** LOG ERROR #%04zu ***] [%s] [%s] %s\n", err_counter, date_buf, - name().c_str(), msg.c_str()); -#endif + #if defined(USING_R) && defined(R_R_H) // if in R environment + REprintf("[*** LOG ERROR #%04zu ***] [%s] [%s] %s\n", + err_counter_val, date_buf, name().c_str(), msg.c_str()); + #else + std::fprintf(stderr, "[*** LOG ERROR #%04zu ***] [%s] [%s] %s\n", err_counter_val, date_buf, + name().c_str(), msg.c_str()); + #endif } } } // namespace spdlog diff --git a/include/spdlog/logger.h b/include/spdlog/logger.h index f49bdc00..34aa0c00 100644 --- a/include/spdlog/logger.h +++ b/include/spdlog/logger.h @@ -311,6 +311,7 @@ protected: spdlog::level_t flush_level_{level::off}; err_handler custom_err_handler_{nullptr}; details::backtracer tracer_; + std::atomic err_counter{0}; // common implementation for after templated public api has been resolved template