@@ -228,63 +228,85 @@ RAC_API void rac_logger_logv(rac_log_level_t level, const char* category,
228228#endif
229229
230230// --- Level-specific logging macros with automatic source location ---
231+ // Each macro checks the current min level BEFORE constructing metadata
232+ // or calling the log function. This avoids function call overhead, metadata
233+ // struct construction, and vsnprintf formatting for filtered messages.
234+ // rac_logger_get_min_level() is an atomic read (no mutex).
235+
236+ #define RAC_LOG_TRACE (category, ...) \
237+ do { \
238+ if (RAC_LOG_TRACE >= rac_logger_get_min_level ()) { \
239+ rac_log_metadata_t _meta = RAC_LOG_META_HERE (); \
240+ rac_logger_logf (RAC_LOG_TRACE, category, &_meta, __VA_ARGS__); \
241+ } \
242+ } while (0 )
231243
232- #define RAC_LOG_TRACE (category, ...) \
233- do { \
234- rac_log_metadata_t _meta = RAC_LOG_META_HERE (); \
235- rac_logger_logf (RAC_LOG_TRACE, category, &_meta, __VA_ARGS__); \
244+ #define RAC_LOG_DEBUG (category, ...) \
245+ do { \
246+ if (RAC_LOG_DEBUG >= rac_logger_get_min_level ()) { \
247+ rac_log_metadata_t _meta = RAC_LOG_META_HERE (); \
248+ rac_logger_logf (RAC_LOG_DEBUG, category, &_meta, __VA_ARGS__); \
249+ } \
236250 } while (0 )
237251
238- #define RAC_LOG_DEBUG (category, ...) \
252+ #define RAC_LOG_INFO (category, ...) \
239253 do { \
240- rac_log_metadata_t _meta = RAC_LOG_META_HERE (); \
241- rac_logger_logf (RAC_LOG_DEBUG, category, &_meta, __VA_ARGS__); \
254+ if (RAC_LOG_INFO >= rac_logger_get_min_level ()) { \
255+ rac_log_metadata_t _meta = RAC_LOG_META_HERE (); \
256+ rac_logger_logf (RAC_LOG_INFO, category, &_meta, __VA_ARGS__); \
257+ } \
242258 } while (0 )
243259
244- #define RAC_LOG_INFO (category, ...) \
245- do { \
246- rac_log_metadata_t _meta = RAC_LOG_META_HERE (); \
247- rac_logger_logf (RAC_LOG_INFO, category, &_meta, __VA_ARGS__); \
260+ #define RAC_LOG_WARNING (category, ...) \
261+ do { \
262+ if (RAC_LOG_WARNING >= rac_logger_get_min_level ()) { \
263+ rac_log_metadata_t _meta = RAC_LOG_META_HERE (); \
264+ rac_logger_logf (RAC_LOG_WARNING, category, &_meta, __VA_ARGS__); \
265+ } \
248266 } while (0 )
249267
250- #define RAC_LOG_WARNING (category, ...) \
251- do { \
252- rac_log_metadata_t _meta = RAC_LOG_META_HERE (); \
253- rac_logger_logf (RAC_LOG_WARNING, category, &_meta, __VA_ARGS__); \
268+ #define RAC_LOG_ERROR (category, ...) \
269+ do { \
270+ if (RAC_LOG_ERROR >= rac_logger_get_min_level ()) { \
271+ rac_log_metadata_t _meta = RAC_LOG_META_HERE (); \
272+ rac_logger_logf (RAC_LOG_ERROR, category, &_meta, __VA_ARGS__); \
273+ } \
254274 } while (0 )
255275
256- #define RAC_LOG_ERROR (category, ...) \
257- do { \
258- rac_log_metadata_t _meta = RAC_LOG_META_HERE (); \
259- rac_logger_logf (RAC_LOG_ERROR, category, &_meta, __VA_ARGS__); \
260- } while (0 )
261-
262- #define RAC_LOG_FATAL (category, ...) \
263- do { \
264- rac_log_metadata_t _meta = RAC_LOG_META_HERE (); \
265- rac_logger_logf (RAC_LOG_FATAL, category, &_meta, __VA_ARGS__); \
276+ #define RAC_LOG_FATAL (category, ...) \
277+ do { \
278+ if (RAC_LOG_FATAL >= rac_logger_get_min_level ()) { \
279+ rac_log_metadata_t _meta = RAC_LOG_META_HERE (); \
280+ rac_logger_logf (RAC_LOG_FATAL, category, &_meta, __VA_ARGS__); \
281+ } \
266282 } while (0 )
267283
268284// --- Error logging with code ---
269285
270- #define RAC_LOG_ERROR_CODE (category, code, ...) \
271- do { \
272- rac_log_metadata_t _meta = RAC_LOG_META_ERROR (code, NULL ); \
273- rac_logger_logf (RAC_LOG_ERROR, category, &_meta, __VA_ARGS__); \
286+ #define RAC_LOG_ERROR_CODE (category, code, ...) \
287+ do { \
288+ if (RAC_LOG_ERROR >= rac_logger_get_min_level ()) { \
289+ rac_log_metadata_t _meta = RAC_LOG_META_ERROR (code, NULL ); \
290+ rac_logger_logf (RAC_LOG_ERROR, category, &_meta, __VA_ARGS__); \
291+ } \
274292 } while (0 )
275293
276294// --- Model context logging ---
277295
278- #define RAC_LOG_MODEL_INFO (category, model_id, framework, ...) \
279- do { \
280- rac_log_metadata_t _meta = RAC_LOG_META_MODEL (model_id, framework); \
281- rac_logger_logf (RAC_LOG_INFO, category, &_meta, __VA_ARGS__); \
296+ #define RAC_LOG_MODEL_INFO (category, model_id, framework, ...) \
297+ do { \
298+ if (RAC_LOG_INFO >= rac_logger_get_min_level ()) { \
299+ rac_log_metadata_t _meta = RAC_LOG_META_MODEL (model_id, framework); \
300+ rac_logger_logf (RAC_LOG_INFO, category, &_meta, __VA_ARGS__); \
301+ } \
282302 } while (0 )
283303
284- #define RAC_LOG_MODEL_ERROR (category, model_id, framework, ...) \
285- do { \
286- rac_log_metadata_t _meta = RAC_LOG_META_MODEL (model_id, framework); \
287- rac_logger_logf (RAC_LOG_ERROR, category, &_meta, __VA_ARGS__); \
304+ #define RAC_LOG_MODEL_ERROR (category, model_id, framework, ...) \
305+ do { \
306+ if (RAC_LOG_ERROR >= rac_logger_get_min_level ()) { \
307+ rac_log_metadata_t _meta = RAC_LOG_META_MODEL (model_id, framework); \
308+ rac_logger_logf (RAC_LOG_ERROR, category, &_meta, __VA_ARGS__); \
309+ } \
288310 } while (0 )
289311
290312// =============================================================================
@@ -341,87 +363,96 @@ namespace rac {
341363class Logger {
342364 public:
343365 explicit Logger (const char * category) : category_(category) {}
344- explicit Logger (const std::string& category) : category_(category.c_str() ) {}
366+ explicit Logger (const std::string& category) : category_(category) {}
345367
346368 void trace (const char * format, ...) const {
369+ if (RAC_LOG_TRACE < rac_logger_get_min_level ()) return ;
347370 va_list args;
348371 va_start (args, format);
349- rac_logger_logv (RAC_LOG_TRACE, category_, nullptr , format, args);
372+ rac_logger_logv (RAC_LOG_TRACE, category_. c_str () , nullptr , format, args);
350373 va_end (args);
351374 }
352375
353376 void debug (const char * format, ...) const {
377+ if (RAC_LOG_DEBUG < rac_logger_get_min_level ()) return ;
354378 va_list args;
355379 va_start (args, format);
356- rac_logger_logv (RAC_LOG_DEBUG, category_, nullptr , format, args);
380+ rac_logger_logv (RAC_LOG_DEBUG, category_. c_str () , nullptr , format, args);
357381 va_end (args);
358382 }
359383
360384 void info (const char * format, ...) const {
385+ if (RAC_LOG_INFO < rac_logger_get_min_level ()) return ;
361386 va_list args;
362387 va_start (args, format);
363- rac_logger_logv (RAC_LOG_INFO, category_, nullptr , format, args);
388+ rac_logger_logv (RAC_LOG_INFO, category_. c_str () , nullptr , format, args);
364389 va_end (args);
365390 }
366391
367392 void warning (const char * format, ...) const {
393+ if (RAC_LOG_WARNING < rac_logger_get_min_level ()) return ;
368394 va_list args;
369395 va_start (args, format);
370- rac_logger_logv (RAC_LOG_WARNING, category_, nullptr , format, args);
396+ rac_logger_logv (RAC_LOG_WARNING, category_. c_str () , nullptr , format, args);
371397 va_end (args);
372398 }
373399
374400 void error (const char * format, ...) const {
401+ if (RAC_LOG_ERROR < rac_logger_get_min_level ()) return ;
375402 va_list args;
376403 va_start (args, format);
377- rac_logger_logv (RAC_LOG_ERROR, category_, nullptr , format, args);
404+ rac_logger_logv (RAC_LOG_ERROR, category_. c_str () , nullptr , format, args);
378405 va_end (args);
379406 }
380407
381408 void error (int32_t code, const char * format, ...) const {
409+ if (RAC_LOG_ERROR < rac_logger_get_min_level ()) return ;
382410 rac_log_metadata_t meta = RAC_LOG_METADATA_EMPTY;
383411 meta.error_code = code;
384412
385413 va_list args;
386414 va_start (args, format);
387- rac_logger_logv (RAC_LOG_ERROR, category_, &meta, format, args);
415+ rac_logger_logv (RAC_LOG_ERROR, category_. c_str () , &meta, format, args);
388416 va_end (args);
389417 }
390418
391419 void fatal (const char * format, ...) const {
420+ // Fatal is always logged — no early exit
392421 va_list args;
393422 va_start (args, format);
394- rac_logger_logv (RAC_LOG_FATAL, category_, nullptr , format, args);
423+ rac_logger_logv (RAC_LOG_FATAL, category_. c_str () , nullptr , format, args);
395424 va_end (args);
396425 }
397426
398427 // Log with model context
399428 void modelInfo (const char * model_id, const char * framework, const char * format, ...) const {
429+ if (RAC_LOG_INFO < rac_logger_get_min_level ()) return ;
400430 rac_log_metadata_t meta = RAC_LOG_METADATA_EMPTY;
401431 meta.model_id = model_id;
402432 meta.framework = framework;
403433
404434 va_list args;
405435 va_start (args, format);
406- rac_logger_logv (RAC_LOG_INFO, category_, &meta, format, args);
436+ rac_logger_logv (RAC_LOG_INFO, category_. c_str () , &meta, format, args);
407437 va_end (args);
408438 }
409439
410440 void modelError (const char * model_id, const char * framework, int32_t code, const char * format,
411441 ...) const {
442+ if (RAC_LOG_ERROR < rac_logger_get_min_level ()) return ;
412443 rac_log_metadata_t meta = RAC_LOG_METADATA_EMPTY;
413444 meta.model_id = model_id;
414445 meta.framework = framework;
415446 meta.error_code = code;
416447
417448 va_list args;
418449 va_start (args, format);
419- rac_logger_logv (RAC_LOG_ERROR, category_, &meta, format, args);
450+ rac_logger_logv (RAC_LOG_ERROR, category_. c_str () , &meta, format, args);
420451 va_end (args);
421452 }
422453
423454 private:
424- const char * category_;
455+ std::string category_;
425456};
426457
427458// Predefined loggers for common categories
0 commit comments