51 static_assert(std::popcount(to_underlying(Level)) == 1);
53 std::is_same_v<
typename decltype(SourceFile)::value_type,
char>,
54 "SourceFile must be a basic_fixed_string<char>");
55 static_assert(std::is_same_v<
typename decltype(Fmt)::value_type,
char>,
"Fmt must be a basic_fixed_string<char>");
58 static constexpr char const *log_level_name =
59 Level == global_state_type::log_fatal ?
"fatal" :
60 Level == global_state_type::log_error ?
"error" :
61 Level == global_state_type::log_warning ?
"warning" :
62 Level == global_state_type::log_info ?
"info" :
63 Level == global_state_type::log_debug ?
"debug" :
64 Level == global_state_type::log_trace ?
"trace" :
65 Level == global_state_type::log_audit ?
"audit" :
66 Level == global_state_type::log_statistics ?
"stats" :
67 "<unknown log level>";
73 template<
typename... Args>
74 hi_force_inline
log_message(Args&&...args) noexcept :
81 hilet utc_time_point = time_stamp_utc::make(_time_stamp);
82 hilet sys_time_point = std::chrono::clock_cast<std::chrono::system_clock>(utc_time_point);
83 hilet local_time_point = zone->to_local(sys_time_point);
85 hilet cpu_id = _time_stamp.cpu_id();
86 hilet thread_id = _time_stamp.thread_id();
87 hilet thread_name = get_thread_name(thread_id);
89 if constexpr (to_bool(Level & global_state_type::log_statistics)) {
90 return std::format(
"{} {}({}) {:5} {}\n", local_time_point, thread_name, cpu_id, log_level_name, _what());
93 "{} {}({}) {:5} {} ({}:{})\n",
99 URL::urlFromPath(SourceFile).filename(),
106 return std::make_unique<log_message>(*
this);