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