ulog_def.h 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018-08-25 armink the first version
  9. */
  10. #ifndef _ULOG_DEF_H_
  11. #define _ULOG_DEF_H_
  12. #include <rtdef.h>
  13. #ifdef __cplusplus
  14. extern "C" {
  15. #endif
  16. /* logger level, the number is compatible for syslog */
  17. #define LOG_LVL_ASSERT 0
  18. #define LOG_LVL_ERROR 3
  19. #define LOG_LVL_WARNING 4
  20. #define LOG_LVL_INFO 6
  21. #define LOG_LVL_DBG 7
  22. /* the output silent level and all level for filter setting */
  23. #ifndef ULOG_USING_SYSLOG
  24. #define LOG_FILTER_LVL_SILENT 0
  25. #define LOG_FILTER_LVL_ALL 7
  26. #else
  27. #define LOG_FILTER_LVL_SILENT 1
  28. #define LOG_FILTER_LVL_ALL 255
  29. #endif /* ULOG_USING_SYSLOG */
  30. /* compatible for rtdbg */
  31. #undef LOG_D
  32. #undef LOG_I
  33. #undef LOG_W
  34. #undef LOG_E
  35. #undef LOG_RAW
  36. #undef DBG_ERROR
  37. #undef DBG_WARNING
  38. #undef DBG_INFO
  39. #undef DBG_LOG
  40. #undef dbg_log
  41. #define DBG_ERROR LOG_LVL_ERROR
  42. #define DBG_WARNING LOG_LVL_WARNING
  43. #define DBG_INFO LOG_LVL_INFO
  44. #define DBG_LOG LOG_LVL_DBG
  45. #define dbg_log(level, ...) \
  46. if ((level) <= LOG_LVL) \
  47. { \
  48. ulog_output(level, LOG_TAG, RT_FALSE, __VA_ARGS__);\
  49. }
  50. #if !defined(LOG_TAG)
  51. /* compatible for rtdbg */
  52. #if defined(DBG_TAG)
  53. #define LOG_TAG DBG_TAG
  54. #elif defined(DBG_SECTION_NAME)
  55. #define LOG_TAG DBG_SECTION_NAME
  56. #else
  57. #define LOG_TAG "NO_TAG"
  58. #endif
  59. #endif /* !defined(LOG_TAG) */
  60. #if !defined(LOG_LVL)
  61. /* compatible for rtdbg */
  62. #if defined(DBG_LVL)
  63. #define LOG_LVL DBG_LVL
  64. #elif defined(DBG_LEVEL)
  65. #define LOG_LVL DBG_LEVEL
  66. #else
  67. #define LOG_LVL LOG_LVL_DBG
  68. #endif
  69. #endif /* !defined(LOG_LVL) */
  70. #if (LOG_LVL >= LOG_LVL_DBG) && (ULOG_OUTPUT_LVL >= LOG_LVL_DBG)
  71. #define ulog_d(TAG, ...) ulog_output(LOG_LVL_DBG, TAG, RT_TRUE, __VA_ARGS__)
  72. #else
  73. #define ulog_d(TAG, ...)
  74. #endif /* (LOG_LVL >= LOG_LVL_DBG) && (ULOG_OUTPUT_LVL >= LOG_LVL_DBG) */
  75. #if (LOG_LVL >= LOG_LVL_INFO) && (ULOG_OUTPUT_LVL >= LOG_LVL_INFO)
  76. #define ulog_i(TAG, ...) ulog_output(LOG_LVL_INFO, TAG, RT_TRUE, __VA_ARGS__)
  77. #else
  78. #define ulog_i(TAG, ...)
  79. #endif /* (LOG_LVL >= LOG_LVL_INFO) && (ULOG_OUTPUT_LVL >= LOG_LVL_INFO) */
  80. #if (LOG_LVL >= LOG_LVL_WARNING) && (ULOG_OUTPUT_LVL >= LOG_LVL_WARNING)
  81. #define ulog_w(TAG, ...) ulog_output(LOG_LVL_WARNING, TAG, RT_TRUE, __VA_ARGS__)
  82. #else
  83. #define ulog_w(TAG, ...)
  84. #endif /* (LOG_LVL >= LOG_LVL_WARNING) && (ULOG_OUTPUT_LVL >= LOG_LVL_WARNING) */
  85. #if (LOG_LVL >= LOG_LVL_ERROR) && (ULOG_OUTPUT_LVL >= LOG_LVL_ERROR)
  86. #define ulog_e(TAG, ...) ulog_output(LOG_LVL_ERROR, TAG, RT_TRUE, __VA_ARGS__)
  87. #else
  88. #define ulog_e(TAG, ...)
  89. #endif /* (LOG_LVL >= LOG_LVL_ERROR) && (ULOG_OUTPUT_LVL >= LOG_LVL_ERROR) */
  90. #if (LOG_LVL >= LOG_LVL_DBG) && (ULOG_OUTPUT_LVL >= LOG_LVL_DBG)
  91. #define ulog_hex(TAG, width, buf, size) ulog_hexdump(TAG, width, buf, size)
  92. #else
  93. #define ulog_hex(TAG, width, buf, size)
  94. #endif /* (LOG_LVL >= LOG_LVL_DBG) && (ULOG_OUTPUT_LVL >= LOG_LVL_DBG) */
  95. /* assert for developer. */
  96. #ifdef ULOG_ASSERT_ENABLE
  97. #define ULOG_ASSERT(EXPR) \
  98. if (!(EXPR)) \
  99. { \
  100. ulog_output(LOG_LVL_ASSERT, LOG_TAG, RT_TRUE, "(%s) has assert failed at %s:%ld.", #EXPR, __FUNCTION__, __LINE__); \
  101. ulog_flush(); \
  102. while (1); \
  103. }
  104. #else
  105. #define ULOG_ASSERT(EXPR)
  106. #endif
  107. /* ASSERT API definition */
  108. #if !defined(ASSERT)
  109. #define ASSERT ULOG_ASSERT
  110. #endif
  111. /* compatible for elog */
  112. #undef assert
  113. #undef log_e
  114. #undef log_w
  115. #undef log_i
  116. #undef log_d
  117. #undef log_v
  118. #undef ELOG_LVL_ASSERT
  119. #undef ELOG_LVL_ERROR
  120. #undef ELOG_LVL_WARN
  121. #undef ELOG_LVL_INFO
  122. #undef ELOG_LVL_DEBUG
  123. #undef ELOG_LVL_VERBOSE
  124. #define assert ASSERT
  125. #define log_e LOG_E
  126. #define log_w LOG_W
  127. #define log_i LOG_I
  128. #define log_d LOG_D
  129. #define log_v LOG_D
  130. #define log_raw LOG_RAW
  131. #define log_hex LOG_HEX
  132. #define ELOG_LVL_ASSERT LOG_LVL_ASSERT
  133. #define ELOG_LVL_ERROR LOG_LVL_ERROR
  134. #define ELOG_LVL_WARN LOG_LVL_WARNING
  135. #define ELOG_LVL_INFO LOG_LVL_INFO
  136. #define ELOG_LVL_DEBUG LOG_LVL_DBG
  137. #define ELOG_LVL_VERBOSE LOG_LVL_DBG
  138. /* setting static output log level */
  139. #ifndef ULOG_OUTPUT_LVL
  140. #define ULOG_OUTPUT_LVL LOG_LVL_DBG
  141. #endif
  142. /* buffer size for every line's log */
  143. #ifndef ULOG_LINE_BUF_SIZE
  144. #define ULOG_LINE_BUF_SIZE 128
  145. #endif
  146. /* output filter's tag max length */
  147. #ifndef ULOG_FILTER_TAG_MAX_LEN
  148. #define ULOG_FILTER_TAG_MAX_LEN 23
  149. #endif
  150. /* output filter's keyword max length */
  151. #ifndef ULOG_FILTER_KW_MAX_LEN
  152. #define ULOG_FILTER_KW_MAX_LEN 15
  153. #endif
  154. #ifndef ULOG_NEWLINE_SIGN
  155. #define ULOG_NEWLINE_SIGN "\r\n"
  156. #endif
  157. #define ULOG_FRAME_MAGIC 0x10
  158. /* tag's level filter */
  159. struct ulog_tag_lvl_filter
  160. {
  161. char tag[ULOG_FILTER_TAG_MAX_LEN + 1];
  162. rt_uint32_t level;
  163. rt_slist_t list;
  164. };
  165. typedef struct ulog_tag_lvl_filter *ulog_tag_lvl_filter_t;
  166. struct ulog_frame
  167. {
  168. /* magic word is 0x10 ('lo') */
  169. rt_uint32_t magic:8;
  170. rt_uint32_t is_raw:1;
  171. rt_uint32_t log_len:23;
  172. rt_uint32_t level;
  173. const char *log;
  174. const char *tag;
  175. };
  176. typedef struct ulog_frame *ulog_frame_t;
  177. struct ulog_backend
  178. {
  179. char name[RT_NAME_MAX];
  180. rt_bool_t support_color;
  181. rt_uint32_t out_level;
  182. void (*init) (struct ulog_backend *backend);
  183. void (*output)(struct ulog_backend *backend, rt_uint32_t level, const char *tag, rt_bool_t is_raw, const char *log, rt_size_t len);
  184. void (*flush) (struct ulog_backend *backend);
  185. void (*deinit)(struct ulog_backend *backend);
  186. /* The filter will be call before output. It will return TRUE when the filter condition is math. */
  187. rt_bool_t (*filter)(struct ulog_backend *backend, rt_uint32_t level, const char *tag, rt_bool_t is_raw, const char *log, rt_size_t len);
  188. rt_slist_t list;
  189. };
  190. typedef struct ulog_backend *ulog_backend_t;
  191. typedef rt_bool_t (*ulog_backend_filter_t)(struct ulog_backend *backend, rt_uint32_t level, const char *tag, rt_bool_t is_raw, const char *log, rt_size_t len);
  192. #ifdef __cplusplus
  193. }
  194. #endif
  195. #endif /* _ULOG_DEF_H_ */