28 thread_local std::array<char, 4096> buffer;
32 if (
sizeof...(args) == 0) {
36 len = std::snprintf(buffer.data(), buffer.size(), fmt, std::forward<Args>(args)...);
37 if (len < 0)
return {};
38 if (len >=
static_cast<int>(buffer.size())) len = buffer.size() - 1;
39 f_msg = std::string(buffer.data(), len);
41 auto t =
static_cast<std::time_t
>(pack.time / 1000);
42 const auto ms =
static_cast<short>(pack.time % 1000);
47 #elif defined(__linux__) || defined(__APPLE__) || defined(__unix__)
50 tm = *std::localtime(&t);
53 thread_local std::array<char, 64> time;
54 std::strftime(time.data(), time.size(),
"%Y-%m-%d %H:%M:%S", &tm);
55 thread_local std::array<char, 80> ms_time;
56 std::snprintf(ms_time.data(), ms_time.size(),
"%s.%03d", time.data(), ms);
58 auto log_level =
"OUT";
60 case LogLevel::TRACE: log_level =
"TRACE";
break;
61 case LogLevel::DEBUG: log_level =
"DEBUG";
break;
62 case LogLevel::INFO: log_level =
"INFO";
break;
63 case LogLevel::WARN: log_level =
"WARN";
break;
64 case LogLevel::ERROR: log_level =
"ERROR";
break;
65 case LogLevel::FATAL: log_level =
"FATAL";
break;
70 len = std::snprintf(buffer.data(), buffer.size(),
"%s [%s] [%s] %s", ms_time.data(), pack.name->c_str(), log_level, f_msg.c_str());
71 if (len < 0)
return {};
72 if (len >=
static_cast<int>(buffer.size())) len = buffer.size() - 1;
73 return {buffer.data(), buffer.data() + len};