213 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			213 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2006-2018, RT-Thread Development Team
 | |
|  *
 | |
|  * SPDX-License-Identifier: Apache-2.0
 | |
|  *
 | |
|  * Change Logs:
 | |
|  * Date           Author       Notes
 | |
|  * 2018-08-25     armink       the first version
 | |
|  */
 | |
| 
 | |
| #ifndef _ULOG_DEF_H_
 | |
| #define _ULOG_DEF_H_
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| /* logger level, the number is compatible for syslog */
 | |
| #define LOG_LVL_ASSERT                 0
 | |
| #define LOG_LVL_ERROR                  3
 | |
| #define LOG_LVL_WARNING                4
 | |
| #define LOG_LVL_INFO                   6
 | |
| #define LOG_LVL_DBG                    7
 | |
| 
 | |
| /* the output silent level and all level for filter setting */
 | |
| #ifndef ULOG_USING_SYSLOG
 | |
| #define LOG_FILTER_LVL_SILENT         0
 | |
| #define LOG_FILTER_LVL_ALL            7
 | |
| #else
 | |
| #define LOG_FILTER_LVL_SILENT         1
 | |
| #define LOG_FILTER_LVL_ALL            255
 | |
| #endif /* ULOG_USING_SYSLOG */
 | |
| 
 | |
| /* compatible for rtdbg */
 | |
| #undef LOG_D
 | |
| #undef LOG_I
 | |
| #undef LOG_W
 | |
| #undef LOG_E
 | |
| #undef LOG_RAW
 | |
| #undef DBG_ERROR
 | |
| #undef DBG_WARNING
 | |
| #undef DBG_INFO
 | |
| #undef DBG_LOG
 | |
| #undef dbg_log
 | |
| #define DBG_ERROR                      LOG_LVL_ERROR
 | |
| #define DBG_WARNING                    LOG_LVL_WARNING
 | |
| #define DBG_INFO                       LOG_LVL_INFO
 | |
| #define DBG_LOG                        LOG_LVL_DBG
 | |
| #define dbg_log(level, ...)                                \
 | |
|     if ((level) <= DBG_LEVEL)                              \
 | |
|     {                                                      \
 | |
|         ulog_output(level, LOG_TAG, RT_FALSE, __VA_ARGS__);\
 | |
|     }
 | |
| 
 | |
| #if !defined(LOG_TAG)
 | |
|     /* compatible for rtdbg */
 | |
|     #if defined(DBG_SECTION_NAME)
 | |
|         #define LOG_TAG                DBG_SECTION_NAME
 | |
|     #else
 | |
|         #define LOG_TAG                "NO_TAG"
 | |
|     #endif
 | |
| #endif /* !defined(LOG_TAG) */
 | |
| 
 | |
| #if !defined(LOG_LVL)
 | |
|     /* compatible for rtdbg */
 | |
|     #if defined(DBG_LEVEL)
 | |
|         #define LOG_LVL                DBG_LEVEL
 | |
|     #else
 | |
|         #define LOG_LVL                LOG_LVL_DBG
 | |
|     #endif
 | |
| #endif /* !defined(LOG_LVL) */
 | |
| 
 | |
| #if (LOG_LVL >= LOG_LVL_DBG) && (ULOG_OUTPUT_LVL >= LOG_LVL_DBG)
 | |
|     #define ulog_d(TAG, ...)           ulog_output(LOG_LVL_DBG, TAG, RT_TRUE, __VA_ARGS__)
 | |
| #else
 | |
|     #define ulog_d(TAG, ...)
 | |
| #endif /* (LOG_LVL >= LOG_LVL_DBG) && (ULOG_OUTPUT_LVL >= LOG_LVL_DBG) */
 | |
| 
 | |
| #if (LOG_LVL >= LOG_LVL_INFO) && (ULOG_OUTPUT_LVL >= LOG_LVL_INFO)
 | |
|     #define ulog_i(TAG, ...)           ulog_output(LOG_LVL_INFO, TAG, RT_TRUE, __VA_ARGS__)
 | |
| #else
 | |
|     #define ulog_i(TAG, ...)
 | |
| #endif /* (LOG_LVL >= LOG_LVL_INFO) && (ULOG_OUTPUT_LVL >= LOG_LVL_INFO) */
 | |
| 
 | |
| #if (LOG_LVL >= LOG_LVL_WARNING) && (ULOG_OUTPUT_LVL >= LOG_LVL_WARNING)
 | |
|     #define ulog_w(TAG, ...)           ulog_output(LOG_LVL_WARNING, TAG, RT_TRUE, __VA_ARGS__)
 | |
| #else
 | |
|     #define ulog_w(TAG, ...)
 | |
| #endif /* (LOG_LVL >= LOG_LVL_WARNING) && (ULOG_OUTPUT_LVL >= LOG_LVL_WARNING) */
 | |
| 
 | |
| #if (LOG_LVL >= LOG_LVL_ERROR) && (ULOG_OUTPUT_LVL >= LOG_LVL_ERROR)
 | |
|     #define ulog_e(TAG, ...)           ulog_output(LOG_LVL_ERROR, TAG, RT_TRUE, __VA_ARGS__)
 | |
| #else
 | |
|     #define ulog_e(TAG, ...)
 | |
| #endif /* (LOG_LVL >= LOG_LVL_ERROR) && (ULOG_OUTPUT_LVL >= LOG_LVL_ERROR) */
 | |
| 
 | |
| #if (LOG_LVL >= LOG_LVL_DBG) && (ULOG_OUTPUT_LVL >= LOG_LVL_DBG)
 | |
|     #define ulog_hex(TAG, width, buf, size)     ulog_hexdump(TAG, width, buf, size)
 | |
| #else
 | |
|     #define ulog_hex(TAG, width, buf, size)
 | |
| #endif /* (LOG_LVL >= LOG_LVL_DBG) && (ULOG_OUTPUT_LVL >= LOG_LVL_DBG) */    
 | |
|     
 | |
| /* assert for developer. */
 | |
| #ifdef ULOG_ASSERT_ENABLE
 | |
|     #define ULOG_ASSERT(EXPR)                                                 \
 | |
|     if (!(EXPR))                                                              \
 | |
|     {                                                                         \
 | |
|         ulog_output(LOG_LVL_ASSERT, LOG_TAG, RT_TRUE, "(%s) has assert failed at %s:%ld.", #EXPR, __FUNCTION__, __LINE__); \
 | |
|         ulog_flush();                                                         \
 | |
|         while (1);                                                            \
 | |
|     }
 | |
| #else
 | |
|     #define ULOG_ASSERT(EXPR)
 | |
| #endif
 | |
| 
 | |
| /* ASSERT API definition */
 | |
| #if !defined(ASSERT)
 | |
|     #define ASSERT           ULOG_ASSERT
 | |
| #endif
 | |
| 
 | |
| /* compatible for elog */
 | |
| #undef assert
 | |
| #undef log_e
 | |
| #undef log_w
 | |
| #undef log_i
 | |
| #undef log_d
 | |
| #undef log_v
 | |
| #undef ELOG_LVL_ASSERT
 | |
| #undef ELOG_LVL_ERROR
 | |
| #undef ELOG_LVL_WARN
 | |
| #undef ELOG_LVL_INFO
 | |
| #undef ELOG_LVL_DEBUG
 | |
| #undef ELOG_LVL_VERBOSE
 | |
| #define assert                         ASSERT
 | |
| #define log_e                          LOG_E
 | |
| #define log_w                          LOG_W
 | |
| #define log_i                          LOG_I
 | |
| #define log_d                          LOG_D
 | |
| #define log_v                          LOG_D
 | |
| #define log_raw                        LOG_RAW
 | |
| #define log_hex                        LOG_HEX    
 | |
| #define ELOG_LVL_ASSERT                LOG_LVL_ASSERT
 | |
| #define ELOG_LVL_ERROR                 LOG_LVL_ERROR
 | |
| #define ELOG_LVL_WARN                  LOG_LVL_WARNING
 | |
| #define ELOG_LVL_INFO                  LOG_LVL_INFO
 | |
| #define ELOG_LVL_DEBUG                 LOG_LVL_DBG
 | |
| #define ELOG_LVL_VERBOSE               LOG_LVL_DBG
 | |
| 
 | |
| /* setting static output log level */
 | |
| #ifndef ULOG_OUTPUT_LVL
 | |
| #define ULOG_OUTPUT_LVL                LOG_LVL_DBG
 | |
| #endif
 | |
| 
 | |
| /* buffer size for every line's log */
 | |
| #ifndef ULOG_LINE_BUF_SIZE
 | |
| #define ULOG_LINE_BUF_SIZE             128
 | |
| #endif
 | |
| 
 | |
| /* output filter's tag max length */
 | |
| #ifndef ULOG_FILTER_TAG_MAX_LEN
 | |
| #define ULOG_FILTER_TAG_MAX_LEN        23
 | |
| #endif
 | |
| 
 | |
| /* output filter's keyword max length */
 | |
| #ifndef ULOG_FILTER_KW_MAX_LEN
 | |
| #define ULOG_FILTER_KW_MAX_LEN         15
 | |
| #endif
 | |
| 
 | |
| #ifndef ULOG_NEWLINE_SIGN
 | |
| #define ULOG_NEWLINE_SIGN              "\r\n"
 | |
| #endif
 | |
| 
 | |
| #define ULOG_FRAME_MAGIC               0x10
 | |
| 
 | |
| /* tag's level filter */
 | |
| struct ulog_tag_lvl_filter
 | |
| {
 | |
|     char tag[ULOG_FILTER_TAG_MAX_LEN + 1];
 | |
|     rt_uint32_t level;
 | |
|     rt_slist_t list;
 | |
| };
 | |
| typedef struct ulog_tag_lvl_filter *ulog_tag_lvl_filter_t;
 | |
| 
 | |
| struct ulog_frame
 | |
| {
 | |
|     /* magic word is 0x10 ('lo') */
 | |
|     rt_uint32_t magic:8;
 | |
|     rt_uint32_t is_raw:1;
 | |
|     rt_uint32_t log_len:23;
 | |
|     rt_uint32_t level;
 | |
|     const char *log;
 | |
|     const char *tag;
 | |
| };
 | |
| typedef struct ulog_frame *ulog_frame_t;
 | |
| 
 | |
| struct ulog_backend
 | |
| {
 | |
|     char name[RT_NAME_MAX];
 | |
|     rt_bool_t support_color;
 | |
|     void (*init)  (struct ulog_backend *backend);
 | |
|     void (*output)(struct ulog_backend *backend, rt_uint32_t level, const char *tag, rt_bool_t is_raw, const char *log, size_t len);
 | |
|     void (*flush) (struct ulog_backend *backend);
 | |
|     void (*deinit)(struct ulog_backend *backend);
 | |
|     rt_slist_t list;
 | |
| };
 | |
| typedef struct ulog_backend *ulog_backend_t;
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif /* _ULOG_DEF_H_ */
 |