49 static_assert(std::popcount(to_underlying(Level)) == 1);
50 static_assert(std::is_same_v<
decltype(SourceFile)::value_type,
char>,
"SourceFile must be a basic_fixed_string<char>");
51 static_assert(std::is_same_v<
decltype(Fmt)::value_type,
char>,
"Fmt must be a basic_fixed_string<char>");
54 static constexpr char const *log_level_name =
55 Level == global_state_type::log_fatal ?
"fatal" :
56 Level == global_state_type::log_error ?
"error" :
57 Level == global_state_type::log_warning ?
"warning" :
58 Level == global_state_type::log_info ?
"info" :
59 Level == global_state_type::log_debug ?
"debug" :
60 Level == global_state_type::log_trace ?
"trace" :
61 Level == global_state_type::log_audit ?
"audit" :
62 Level == global_state_type::log_statistics ?
"stats" :
63 "<unknown log level>";
69 template<
typename... Args>
70 hi_force_inline
log_message(Args&&...args) noexcept :
77 hilet utc_time_point = time_stamp_utc::make(_time_stamp);
78 hilet sys_time_point = std::chrono::clock_cast<std::chrono::system_clock>(utc_time_point);
79 hilet local_time_point = zone->to_local(sys_time_point);
81 hilet cpu_id = _time_stamp.cpu_id();
82 hilet thread_id = _time_stamp.thread_id();
84 if constexpr (to_bool(Level & global_state_type::log_statistics)) {
85 return std::format(
"{} {:2}:{:<10} {:5} {}\n", local_time_point, cpu_id, thread_id, log_level_name, _what());
88 "{} {:2}:{:<10} {:5} {} ({}:{})\n",
94 URL::urlFromPath(SourceFile).filename(),
101 return std::make_unique<log_message>(*
this);