1 #ifndef LOG_H 2 #define LOG_H 3 4 #include <stdio.h> 5 #include <errno.h> 6 #include <inttypes.h> 7 #include <string.h> 8 9 #define LOG_LEVEL_DEBUG 10 10 #define LOG_LEVEL_INFO 20 11 #define LOG_LEVEL_WARN 30 12 #define LOG_LEVEL_ERROR 40 13 14 #ifndef LOG_LEVEL 15 #define LOG_LEVEL LOG_LEVEL_INFO 16 #endif 17 18 #define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) 19 20 /* safe readable version of errno */ 21 #define clean_errno() (errno == 0 ? "None" : strerror(errno)) 22 23 #if defined (LOG_NO_COLORS) || defined (_WIN32) 24 #define log_error(M, ...) fprintf(stderr, "ERR " M " at %s (%s:%d) errno:%s\n", ##__VA_ARGS__, __func__, __FILE__, __LINE__, clean_errno()) 25 #define log_warn(M, ...) fprintf(stderr, "WARN " M " at %s (%s:%d) errno:%s\n", ##__VA_ARGS__, __func__, __FILE__, __LINE__, clean_errno()) 26 #define log_info(M, ...) fprintf(stderr, "INFO " M " at %s (%s:%d)\n", ##__VA_ARGS__, __func__, __FILENAME__, __LINE__) 27 #define log_debug(M, ...) fprintf(stderr, "DEBUG " M " at %s (%s:%d)\n", ##__VA_ARGS__, __func__, __FILE__, __LINE__) 28 #else 29 #define log_error(M, ...) fprintf(stderr, "\33[31mERR\33[39m " M " \33[90m at %s (%s:%d) \33[94merrno: %s\33[39m\n", ##__VA_ARGS__, __func__, __FILE__, __LINE__, clean_errno()) 30 #define log_warn(M, ...) fprintf(stderr, "\33[91mWARN\33[39m " M " \33[90m at %s (%s:%d) \33[94merrno: %s\33[39m\n", ##__VA_ARGS__, __func__, __FILE__, __LINE__, clean_errno()) 31 #define log_info(M, ...) fprintf(stderr, "\33[32mINFO\33[39m " M " \33[90m at %s (%s:%d) \33[39m\n", ##__VA_ARGS__, __func__, __FILENAME__, __LINE__) 32 #define log_debug(M, ...) fprintf(stderr, "\33[34mDEBUG\33[39m " M " \33[90m at %s (%s:%d) \33[39m\n", ##__VA_ARGS__, __func__, __FILE__, __LINE__) 33 #endif /* NOCOLORS */ 34 35 #if LOG_LEVEL > LOG_LEVEL_ERROR 36 #undef log_error 37 #define log_error(M, ...) do { if (0) fprintf(stderr, "\33[31mERR\33[39m " M " \33[90m at %s (%s:%d) \33[94merrno: %s\33[39m\n", ##__VA_ARGS__, __func__, __FILE__, __LINE__, clean_errno()); } while(0) 38 #endif 39 40 #if LOG_LEVEL > LOG_LEVEL_WARN 41 #undef log_warn 42 #define log_warn(M, ...) do { if (0) fprintf(stderr, "\33[91mWARN\33[39m " M " \33[90m at %s (%s:%d) \33[94merrno: %s\33[39m\n", ##__VA_ARGS__, __func__, __FILE__, __LINE__, clean_errno()); } while (0) 43 #endif 44 45 #if LOG_LEVEL > LOG_LEVEL_INFO 46 #undef log_info 47 #define log_info(M, ...) do { if (0) fprintf(stderr, "\33[32mINFO\33[39m " M " \33[90m at %s (%s:%d) \33[39m\n", ##__VA_ARGS__, __func__, __FILENAME__, __LINE__); } while (0) 48 #endif 49 50 #if LOG_LEVEL > LOG_LEVEL_DEBUG 51 #undef log_debug 52 #define log_debug(M, ...) do { if (0) fprintf(stderr, "\33[34mDEBUG\33[39m " M " \33[90m at %s (%s:%d) \33[39m\n", ##__VA_ARGS__, __func__, __FILE__, __LINE__); } while (0) 53 #endif 54 55 #endif //LOG_H 56