// retoor #ifndef R_INTERFACES_LOGGER_H #define R_INTERFACES_LOGGER_H #include typedef enum { LOG_LEVEL_TRACE, LOG_LEVEL_DEBUG, LOG_LEVEL_INFO, LOG_LEVEL_WARN, LOG_LEVEL_ERROR, LOG_LEVEL_FATAL } log_level_t; typedef struct logger_t *logger_handle; logger_handle logger_create(log_level_t level); void logger_destroy(logger_handle logger); void logger_set_level(logger_handle logger, log_level_t level); log_level_t logger_get_level(logger_handle logger); void logger_log(logger_handle logger, log_level_t level, const char *file, int line, const char *fmt, ...); #define LOG_TRACE(logger, fmt, ...) \ logger_log(logger, LOG_LEVEL_TRACE, __FILE__, __LINE__, fmt, ##__VA_ARGS__) #define LOG_DEBUG(logger, fmt, ...) \ logger_log(logger, LOG_LEVEL_DEBUG, __FILE__, __LINE__, fmt, ##__VA_ARGS__) #define LOG_INFO(logger, fmt, ...) \ logger_log(logger, LOG_LEVEL_INFO, __FILE__, __LINE__, fmt, ##__VA_ARGS__) #define LOG_WARN(logger, fmt, ...) \ logger_log(logger, LOG_LEVEL_WARN, __FILE__, __LINE__, fmt, ##__VA_ARGS__) #define LOG_ERROR(logger, fmt, ...) \ logger_log(logger, LOG_LEVEL_ERROR, __FILE__, __LINE__, fmt, ##__VA_ARGS__) #define LOG_FATAL(logger, fmt, ...) \ logger_log(logger, LOG_LEVEL_FATAL, __FILE__, __LINE__, fmt, ##__VA_ARGS__) #endif