2828 * auto &log = vix::utils::Logger::getInstance();
2929 *
3030 * // Optional: set explicit level (otherwise uses VIX_LOG_LEVEL or defaults to INFO)
31- * log.setLevel(vix::utils::Logger::Level::INFO );
31+ * log.setLevel(vix::utils::Logger::Level::Info );
3232 *
3333 * // Optional: override console pattern
3434 * // Example: compact + colored level
4545 * log.setContext(ctx);
4646 *
4747 * log.info("User {} logged in", user);
48- * log.logf(vix::utils::Logger::Level::INFO , "Login ok",
48+ * log.logf(vix::utils::Logger::Level::Info , "Login ok",
4949 * "user", user.c_str(),
5050 * "latency_ms", 12);
5151 * @endcode
5252 */
5353
5454#if defined(_WIN32)
55- // Windows headers sometimes define macros like ERROR/DEBUG/min/max.
55+ // Windows headers sometimes define macros like ERROR/DEBUG/INFO/ min/max.
5656// They break enum values or common identifiers.
5757
5858#if defined(ERROR)
6767#define VIX_UTILS_RESTORE_DEBUG_MACRO 1
6868#endif
6969
70+ #if defined(INFO)
71+ #pragma push_macro("INFO")
72+ #undef INFO
73+ #define VIX_UTILS_RESTORE_INFO_MACRO 1
74+ #endif
75+
7076#if defined(min)
7177#pragma push_macro("min")
7278#undef min
@@ -141,13 +147,13 @@ namespace vix::utils
141147 */
142148 enum class Level
143149 {
144- TRACE ,
145- DEBUG ,
146- INFO ,
147- WARN ,
148- ERROR ,
149- CRITICAL ,
150- OFF
150+ Trace ,
151+ Debug ,
152+ Info ,
153+ Warn ,
154+ Error ,
155+ Critical ,
156+ Off
151157 };
152158
153159 /* *
@@ -222,7 +228,7 @@ namespace vix::utils
222228 template <typename ... Args>
223229 void trace (fmt::format_string<Args...> fmtstr, Args &&...args)
224230 {
225- log (Level::TRACE , fmtstr, std::forward<Args>(args)...);
231+ log (Level::Trace , fmtstr, std::forward<Args>(args)...);
226232 }
227233
228234 /* *
@@ -231,7 +237,7 @@ namespace vix::utils
231237 template <typename ... Args>
232238 void debug (fmt::format_string<Args...> fmtstr, Args &&...args)
233239 {
234- log (Level::DEBUG , fmtstr, std::forward<Args>(args)...);
240+ log (Level::Debug , fmtstr, std::forward<Args>(args)...);
235241 }
236242
237243 /* *
@@ -240,7 +246,7 @@ namespace vix::utils
240246 template <typename ... Args>
241247 void info (fmt::format_string<Args...> fmtstr, Args &&...args)
242248 {
243- log (Level::INFO , fmtstr, std::forward<Args>(args)...);
249+ log (Level::Info , fmtstr, std::forward<Args>(args)...);
244250 }
245251
246252 /* *
@@ -249,7 +255,7 @@ namespace vix::utils
249255 template <typename ... Args>
250256 void warn (fmt::format_string<Args...> fmtstr, Args &&...args)
251257 {
252- log (Level::WARN , fmtstr, std::forward<Args>(args)...);
258+ log (Level::Warn , fmtstr, std::forward<Args>(args)...);
253259 }
254260
255261 /* *
@@ -258,7 +264,7 @@ namespace vix::utils
258264 template <typename ... Args>
259265 void error (fmt::format_string<Args...> fmtstr, Args &&...args)
260266 {
261- log (Level::ERROR , fmtstr, std::forward<Args>(args)...);
267+ log (Level::Error , fmtstr, std::forward<Args>(args)...);
262268 }
263269
264270 /* *
@@ -267,7 +273,7 @@ namespace vix::utils
267273 template <typename ... Args>
268274 void critical (fmt::format_string<Args...> fmtstr, Args &&...args)
269275 {
270- log (Level::CRITICAL , fmtstr, std::forward<Args>(args)...);
276+ log (Level::Critical , fmtstr, std::forward<Args>(args)...);
271277 }
272278
273279 /* *
@@ -282,7 +288,7 @@ namespace vix::utils
282288 template <typename ... Args>
283289 void log (Level level, fmt::format_string<Args...> fmtstr, Args &&...args)
284290 {
285- if (level == Level::OFF )
291+ if (level == Level::Off )
286292 return ;
287293
288294 std::shared_ptr<spdlog::logger> spd;
@@ -322,7 +328,7 @@ namespace vix::utils
322328 fmt::format_string<Args...> fmtstr,
323329 Args &&...args)
324330 {
325- if (level == Level::OFF )
331+ if (level == Level::Off )
326332 return ;
327333
328334 std::shared_ptr<spdlog::logger> spd;
@@ -357,7 +363,7 @@ namespace vix::utils
357363 [[noreturn]] void throwError (fmt::format_string<Args...> fmtstr, Args &&...args)
358364 {
359365 auto msg = fmt::format (fmtstr, std::forward<Args>(args)...);
360- log (Level::ERROR , " {}" , msg);
366+ log (Level::Error , " {}" , msg);
361367 throw std::runtime_error (msg);
362368 }
363369
@@ -366,7 +372,7 @@ namespace vix::utils
366372 */
367373 [[noreturn]] void throwError (const std::string &msg)
368374 {
369- log (Level::ERROR , " {}" , msg);
375+ log (Level::Error , " {}" , msg);
370376 throw std::runtime_error (msg);
371377 }
372378
@@ -441,7 +447,7 @@ namespace vix::utils
441447 template <typename ... Args>
442448 void logf (Level level, const std::string &msg, Args &&...kvpairs)
443449 {
444- if (level == Level::OFF )
450+ if (level == Level::Off )
445451 return ;
446452
447453 std::lock_guard<std::mutex> lock (mutex_);
@@ -500,7 +506,7 @@ namespace vix::utils
500506 */
501507 static Level parseLevelFromEnv (
502508 std::string_view envName = " VIX_LOG_LEVEL" ,
503- Level fallback = Level::WARN );
509+ Level fallback = Level::Warn );
504510
505511 /* *
506512 * @brief Whether pretty JSON output should include ANSI colors.
@@ -514,22 +520,22 @@ namespace vix::utils
514520 {
515521 std::lock_guard<std::mutex> lock (mutex_);
516522 if (!spd_)
517- return Level::OFF ;
523+ return Level::Off ;
518524
519525 const auto lvl = spd_->level ();
520526 if (lvl == spdlog::level::trace)
521- return Level::TRACE ;
527+ return Level::Trace ;
522528 if (lvl == spdlog::level::debug)
523- return Level::DEBUG ;
529+ return Level::Debug ;
524530 if (lvl == spdlog::level::info)
525- return Level::INFO ;
531+ return Level::Info ;
526532 if (lvl == spdlog::level::warn)
527- return Level::WARN ;
533+ return Level::Warn ;
528534 if (lvl == spdlog::level::err)
529- return Level::ERROR ;
535+ return Level::Error ;
530536 if (lvl == spdlog::level::critical)
531- return Level::CRITICAL ;
532- return Level::OFF ;
537+ return Level::Critical ;
538+ return Level::Off ;
533539 }
534540
535541 /* *
@@ -556,19 +562,19 @@ namespace vix::utils
556562 {
557563 switch (level)
558564 {
559- case Level::TRACE :
565+ case Level::Trace :
560566 return spdlog::level::trace;
561- case Level::DEBUG :
567+ case Level::Debug :
562568 return spdlog::level::debug;
563- case Level::INFO :
569+ case Level::Info :
564570 return spdlog::level::info;
565- case Level::WARN :
571+ case Level::Warn :
566572 return spdlog::level::warn;
567- case Level::ERROR :
573+ case Level::Error :
568574 return spdlog::level::err;
569- case Level::CRITICAL :
575+ case Level::Critical :
570576 return spdlog::level::critical;
571- case Level::OFF :
577+ case Level::Off :
572578 return spdlog::level::off;
573579 default :
574580 return spdlog::level::info;
@@ -715,19 +721,19 @@ namespace vix::utils
715721 {
716722 switch (level)
717723 {
718- case Level::TRACE :
724+ case Level::Trace :
719725 return " trace" ;
720- case Level::DEBUG :
726+ case Level::Debug :
721727 return " debug" ;
722- case Level::INFO :
728+ case Level::Info :
723729 return " info" ;
724- case Level::WARN :
730+ case Level::Warn :
725731 return " warn" ;
726- case Level::ERROR :
732+ case Level::Error :
727733 return " error" ;
728- case Level::CRITICAL :
734+ case Level::Critical :
729735 return " critical" ;
730- case Level::OFF :
736+ case Level::Off :
731737 return " off" ;
732738 default :
733739 return " info" ;
@@ -1073,6 +1079,28 @@ namespace vix::utils
10731079 static std::string c_bool (std::string_view s, bool on) { return ansi_wrap (" \033 [35m" , s, on); }
10741080 static std::string c_punc (std::string_view s, bool on) { return ansi_wrap (" \033 [90m" , s, on); }
10751081
1082+ static inline const char *vix_getenv (const char *name) noexcept
1083+ {
1084+ #if defined(_WIN32)
1085+ // _dupenv_s returns heap memory we must free.
1086+ static thread_local std::string value;
1087+ value.clear ();
1088+
1089+ char *buf = nullptr ;
1090+ size_t len = 0 ;
1091+
1092+ if (_dupenv_s (&buf, &len, name) != 0 || !buf)
1093+ return nullptr ;
1094+
1095+ value.assign (buf);
1096+ free (buf);
1097+
1098+ return value.empty () ? nullptr : value.c_str ();
1099+ #else
1100+ return std::getenv (name);
1101+ #endif
1102+ }
1103+
10761104 /* *
10771105 * @brief Whether console synchronization is enabled.
10781106 *
@@ -1082,7 +1110,7 @@ namespace vix::utils
10821110 */
10831111 static bool console_sync_enabled ()
10841112 {
1085- if (const char *v = std::getenv (" VIX_CONSOLE_SYNC" ); v && *v)
1113+ if (const char *v = vix_getenv (" VIX_CONSOLE_SYNC" ); v && *v)
10861114 return std::string_view (v) != " 0" && std::string_view (v) != " false" ;
10871115 return false ;
10881116 }
@@ -1107,6 +1135,11 @@ namespace vix::utils
11071135#undef VIX_UTILS_RESTORE_DEBUG_MACRO
11081136#endif
11091137
1138+ #if defined(VIX_UTILS_RESTORE_INFO_MACRO)
1139+ #pragma pop_macro("INFO")
1140+ #undef VIX_UTILS_RESTORE_INFO_MACRO
1141+ #endif
1142+
11101143#if defined(VIX_UTILS_RESTORE_ERROR_MACRO)
11111144#pragma pop_macro("ERROR")
11121145#undef VIX_UTILS_RESTORE_ERROR_MACRO
0 commit comments