#pragma once #include "sdk.h" // boost.beast будет использовать std::string_view вместо boost::string_view #define BOOST_BEAST_USE_STD_STRING_VIEW #include #include "session.h" namespace http_server { using namespace std; class Logger { mutex mtx_; ostream* stream_ptr_; Logger() = default; public: static Logger& GetInstance(); void SetOutStream(ostream& stream); auto GetTimeStamp() { const auto now = std::chrono::system_clock::now(); const auto t_c = std::chrono::system_clock::to_time_t(now); return std::put_time(std::localtime(&t_c), "%F %T"); } template void Log(First fst, Args... args) { lock_guard guard(mtx_); *stream_ptr_ << GetTimeStamp() << ": "s; LogImpl(fst, args...); } private: template void LogImpl(First fst, Args... args) { *stream_ptr_ << fst; LogImpl(args...); } template void LogImpl(First fst) { *stream_ptr_ << fst << '\n'; } }; } // namespace http_server