hlog.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #ifndef HV_LOG_H_
  2. #define HV_LOG_H_
  3. /*
  4. * hlog is thread-safe
  5. */
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9. #define CLR_CLR "\033[0m" /* 恢复颜色 */
  10. #define CLR_BLACK "\033[30m" /* 黑色字 */
  11. #define CLR_RED "\033[31m" /* 红色字 */
  12. #define CLR_GREEN "\033[32m" /* 绿色字 */
  13. #define CLR_YELLOW "\033[33m" /* 黄色字 */
  14. #define CLR_BLUE "\033[34m" /* 蓝色字 */
  15. #define CLR_PURPLE "\033[35m" /* 紫色字 */
  16. #define CLR_SKYBLUE "\033[36m" /* 天蓝字 */
  17. #define CLR_WHITE "\033[37m" /* 白色字 */
  18. #define CLR_BLK_WHT "\033[40;37m" /* 黑底白字 */
  19. #define CLR_RED_WHT "\033[41;37m" /* 红底白字 */
  20. #define CLR_GREEN_WHT "\033[42;37m" /* 绿底白字 */
  21. #define CLR_YELLOW_WHT "\033[43;37m" /* 黄底白字 */
  22. #define CLR_BLUE_WHT "\033[44;37m" /* 蓝底白字 */
  23. #define CLR_PURPLE_WHT "\033[45;37m" /* 紫底白字 */
  24. #define CLR_SKYBLUE_WHT "\033[46;37m" /* 天蓝底白字 */
  25. #define CLR_WHT_BLK "\033[47;30m" /* 白底黑字 */
  26. // XXX(id, str, clr)
  27. #define LOG_LEVEL_MAP(XXX) \
  28. XXX(LOG_LEVEL_DEBUG, "DEBUG", CLR_WHITE) \
  29. XXX(LOG_LEVEL_INFO, "INFO ", CLR_GREEN) \
  30. XXX(LOG_LEVEL_WARN, "WARN ", CLR_YELLOW) \
  31. XXX(LOG_LEVEL_ERROR, "ERROR", CLR_RED) \
  32. XXX(LOG_LEVEL_FATAL, "FATAL", CLR_RED_WHT)
  33. typedef enum {
  34. LOG_LEVEL_VERBOSE = 0,
  35. #define XXX(id, str, clr) id,
  36. LOG_LEVEL_MAP(XXX)
  37. #undef XXX
  38. LOG_LEVEL_SILENT
  39. } log_level_e;
  40. #define DEFAULT_LOG_FILE "default"
  41. #define DEFAULT_LOG_LEVEL LOG_LEVEL_VERBOSE
  42. #define DEFAULT_LOG_REMAIN_DAYS 1
  43. #define DEFAULT_LOG_MAX_BUFSIZE (1<<14) // 16k
  44. #define DEFAULT_LOG_MAX_FILESIZE (1<<24) // 16M
  45. // logger: default file_logger
  46. // network_logger() see event/nlog.h
  47. typedef void (*logger_handler)(int loglevel, const char* buf, int len);
  48. void stdout_logger(int loglevel, const char* buf, int len);
  49. void stderr_logger(int loglevel, const char* buf, int len);
  50. void file_logger(int loglevel, const char* buf, int len);
  51. // network_logger implement see event/nlog.h
  52. // void network_logger(int loglevel, const char* buf, int len);
  53. typedef struct logger_s logger_t;
  54. logger_t* logger_create();
  55. void logger_destroy(logger_t* logger);
  56. void logger_set_handler(logger_t* logger, logger_handler fn);
  57. void logger_set_level(logger_t* logger, int level);
  58. void logger_set_max_bufsize(logger_t* logger, unsigned int bufsize);
  59. void logger_enable_color(logger_t* logger, int on);
  60. int logger_print(logger_t* logger, int level, const char* fmt, ...);
  61. // below for file logger
  62. void logger_set_file(logger_t* logger, const char* filepath);
  63. void logger_set_max_filesize(logger_t* logger, unsigned long long filesize);
  64. void logger_set_remain_days(logger_t* logger, int days);
  65. void logger_enable_fsync(logger_t* logger, int on);
  66. void logger_fsync(logger_t* logger);
  67. const char* logger_get_cur_file(logger_t* logger);
  68. // hlog: default logger instance
  69. logger_t* default_logger();
  70. // macro hlog*
  71. #define hlog default_logger()
  72. #define hlog_set_file(filepath) logger_set_file(hlog, filepath)
  73. #define hlog_set_level(level) logger_set_level(hlog, level)
  74. #define hlog_set_max_filesize(filesize) logger_set_max_filesize(hlog, filesize)
  75. #define hlog_set_remain_days(days) logger_set_remain_days(hlog, days)
  76. #define hlog_enable_fsync() logger_enable_fsync(hlog, 1)
  77. #define hlog_disable_fsync() logger_enable_fsync(hlog, 0)
  78. #define hlog_fsync() logger_fsync(hlog)
  79. #define hlog_get_cur_file() logger_get_cur_file(hlog)
  80. #define hlogd(fmt, ...) logger_print(hlog, LOG_LEVEL_DEBUG, fmt " [%s:%d:%s]\n", ## __VA_ARGS__, __FILE__, __LINE__, __FUNCTION__)
  81. #define hlogi(fmt, ...) logger_print(hlog, LOG_LEVEL_INFO, fmt " [%s:%d:%s]\n", ## __VA_ARGS__, __FILE__, __LINE__, __FUNCTION__)
  82. #define hlogw(fmt, ...) logger_print(hlog, LOG_LEVEL_WARN, fmt " [%s:%d:%s]\n", ## __VA_ARGS__, __FILE__, __LINE__, __FUNCTION__)
  83. #define hloge(fmt, ...) logger_print(hlog, LOG_LEVEL_ERROR, fmt " [%s:%d:%s]\n", ## __VA_ARGS__, __FILE__, __LINE__, __FUNCTION__)
  84. #define hlogf(fmt, ...) logger_print(hlog, LOG_LEVEL_FATAL, fmt " [%s:%d:%s]\n", ## __VA_ARGS__, __FILE__, __LINE__, __FUNCTION__)
  85. // below for android
  86. #if defined(ANDROID) || defined(__ANDROID__)
  87. #include <android/log.h>
  88. #define LOG_TAG "JNI"
  89. #undef hlogd
  90. #undef hlogi
  91. #undef hlogw
  92. #undef hloge
  93. #undef hlogf
  94. #define hlogd(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
  95. #define hlogi(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
  96. #define hlogw(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)
  97. #define hloge(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
  98. #define hlogf(...) __android_log_print(ANDROID_LOG_FATAL, LOG_TAG, __VA_ARGS__)
  99. #endif
  100. // macro alias
  101. #if !defined(LOGD) && !defined(LOGI) && !defined(LOGW) && !defined(LOGE) && !defined(LOGF)
  102. #define LOGD hlogd
  103. #define LOGI hlogi
  104. #define LOGW hlogw
  105. #define LOGE hloge
  106. #define LOGF hlogf
  107. #endif
  108. #ifdef __cplusplus
  109. } // extern "C"
  110. #endif
  111. #endif // HV_LOG_H_