xref: /nrf52832-nimble/rt-thread/components/utilities/ulog/ulog_def.h (revision 104654410c56c573564690304ae786df310c91fc)
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