From 2fe79faf3d03e2c9e0c84bc5bf3154222d03b608 Mon Sep 17 00:00:00 2001 From: armink Date: Thu, 8 Nov 2018 10:59:25 +0800 Subject: [PATCH 1/7] [component][ulog] Fix a memory leak problem. --- components/utilities/ulog/ulog.c | 1 + 1 file changed, 1 insertion(+) diff --git a/components/utilities/ulog/ulog.c b/components/utilities/ulog/ulog.c index bea6500f7e..a878baaa12 100644 --- a/components/utilities/ulog/ulog.c +++ b/components/utilities/ulog/ulog.c @@ -790,6 +790,7 @@ int ulog_tag_lvl_filter_set(const char *tag, rt_uint32_t level) { /* remove current tag's level filter when input level is the lowest level */ rt_slist_remove(&ulog.filter.tag_lvl_list, &tag_lvl->list); + rt_free(tag_lvl); } else { From ad602f5b909fe13714f34f2d27e2e38632e46c59 Mon Sep 17 00:00:00 2001 From: armink Date: Thu, 8 Nov 2018 11:09:35 +0800 Subject: [PATCH 2/7] [component][ulog] Add filter get API. --- components/utilities/ulog/ulog.c | 65 +++++++++++++++++++++------- components/utilities/ulog/ulog.h | 4 ++ components/utilities/ulog/ulog_def.h | 9 ++++ 3 files changed, 62 insertions(+), 16 deletions(-) diff --git a/components/utilities/ulog/ulog.c b/components/utilities/ulog/ulog.c index a878baaa12..ceb0b40ec2 100644 --- a/components/utilities/ulog/ulog.c +++ b/components/utilities/ulog/ulog.c @@ -74,15 +74,6 @@ #error "the log line buffer size must more than 80" #endif -/* tag's level filter */ -struct tag_lvl_filter -{ - char tag[ULOG_FILTER_TAG_MAX_LEN + 1]; - rt_uint32_t level; - rt_slist_t list; -}; -typedef struct tag_lvl_filter *tag_lvl_filter_t; - struct rt_ulog { rt_bool_t init_ok; @@ -760,7 +751,7 @@ void ulog_hexdump(const char *name, rt_size_t width, rt_uint8_t *buf, rt_size_t int ulog_tag_lvl_filter_set(const char *tag, rt_uint32_t level) { rt_slist_t *node; - tag_lvl_filter_t tag_lvl = NULL; + ulog_tag_lvl_filter_t tag_lvl = NULL; int result = RT_EOK; RT_ASSERT(level <= LOG_FILTER_LVL_ALL); @@ -773,7 +764,7 @@ int ulog_tag_lvl_filter_set(const char *tag, rt_uint32_t level) /* find the tag in list */ for (node = rt_slist_first(&ulog.filter.tag_lvl_list); node; node = rt_slist_next(node)) { - tag_lvl = rt_slist_entry(node, struct tag_lvl_filter, list); + tag_lvl = rt_slist_entry(node, struct ulog_tag_lvl_filter, list); if (!rt_strncmp(tag_lvl->tag, tag, ULOG_FILTER_TAG_MAX_LEN)) { break; @@ -804,7 +795,7 @@ int ulog_tag_lvl_filter_set(const char *tag, rt_uint32_t level) if (level != LOG_FILTER_LVL_ALL) { /* new a tag's level filter */ - tag_lvl = (tag_lvl_filter_t)rt_malloc(sizeof(struct tag_lvl_filter)); + tag_lvl = (ulog_tag_lvl_filter_t)rt_malloc(sizeof(struct ulog_tag_lvl_filter)); if (tag_lvl) { rt_memset(tag_lvl->tag, 0 , sizeof(tag_lvl->tag)); @@ -835,7 +826,7 @@ int ulog_tag_lvl_filter_set(const char *tag, rt_uint32_t level) rt_uint32_t ulog_tag_lvl_filter_get(const char *tag) { rt_slist_t *node; - tag_lvl_filter_t tag_lvl = NULL; + ulog_tag_lvl_filter_t tag_lvl = NULL; rt_uint32_t level = LOG_FILTER_LVL_ALL; if (!ulog.init_ok) @@ -846,7 +837,7 @@ rt_uint32_t ulog_tag_lvl_filter_get(const char *tag) /* find the tag in list */ for (node = rt_slist_first(&ulog.filter.tag_lvl_list); node; node = rt_slist_next(node)) { - tag_lvl = rt_slist_entry(node, struct tag_lvl_filter, list); + tag_lvl = rt_slist_entry(node, struct ulog_tag_lvl_filter, list); if (!rt_strncmp(tag_lvl->tag, tag, ULOG_FILTER_TAG_MAX_LEN)) { level = tag_lvl->level; @@ -859,6 +850,16 @@ rt_uint32_t ulog_tag_lvl_filter_get(const char *tag) return level; } +/** + * get the tag's level list on filter + * + * @return tag's level list + */ +rt_slist_t *ulog_tag_lvl_list_get(void) +{ + return &ulog.filter.tag_lvl_list; +} + /** * set log global filter level * @@ -873,6 +874,18 @@ void ulog_global_filter_lvl_set(rt_uint32_t level) ulog.filter.level = level; } +/** + * get log global filter level + * + * @return log level: LOG_LVL_ASSERT, LOG_LVL_ERROR, LOG_LVL_WARNING, LOG_LVL_INFO, LOG_LVL_DBG + * LOG_FILTER_LVL_SILENT: disable all log output, except assert level + * LOG_FILTER_LVL_ALL: enable all log output + */ +rt_uint32_t ulog_global_filter_lvl_get(void) +{ + return ulog.filter.level; +} + /** * set log global filter tag * @@ -885,6 +898,16 @@ void ulog_global_filter_tag_set(const char *tag) rt_strncpy(ulog.filter.tag, tag, ULOG_FILTER_TAG_MAX_LEN); } +/** + * get log global filter tag + * + * @return tag + */ +const char *ulog_global_filter_tag_get(void) +{ + return ulog.filter.tag; +} + /** * set log global filter keyword * @@ -897,6 +920,16 @@ void ulog_global_filter_kw_set(const char *keyword) rt_strncpy(ulog.filter.keyword, keyword, ULOG_FILTER_KW_MAX_LEN); } +/** + * get log global filter keyword + * + * @return keyword + */ +const char *ulog_global_filter_kw_get(void) +{ + return ulog.filter.keyword; +} + #if defined(RT_USING_FINSH) && defined(FINSH_USING_MSH) #include @@ -1198,10 +1231,10 @@ void ulog_deinit(void) #ifdef ULOG_USING_FILTER /* deinit tag's level filter */ { - tag_lvl_filter_t tag_lvl; + ulog_tag_lvl_filter_t tag_lvl; for (node = rt_slist_first(&ulog.filter.tag_lvl_list); node; node = rt_slist_next(node)) { - tag_lvl = rt_slist_entry(node, struct tag_lvl_filter, list); + tag_lvl = rt_slist_entry(node, struct ulog_tag_lvl_filter, list); rt_free(tag_lvl); } } diff --git a/components/utilities/ulog/ulog.h b/components/utilities/ulog/ulog.h index f39df6a2c7..ad0525c9a2 100644 --- a/components/utilities/ulog/ulog.h +++ b/components/utilities/ulog/ulog.h @@ -58,9 +58,13 @@ rt_err_t ulog_backend_unregister(ulog_backend_t backend); */ int ulog_tag_lvl_filter_set(const char *tag, rt_uint32_t level); rt_uint32_t ulog_tag_lvl_filter_get(const char *tag); +rt_slist_t *ulog_tag_lvl_list_get(void); void ulog_global_filter_lvl_set(rt_uint32_t level); +rt_uint32_t ulog_global_filter_lvl_get(void); void ulog_global_filter_tag_set(const char *tag); +const char *ulog_global_filter_tag_get(void); void ulog_global_filter_kw_set(const char *keyword); +const char *ulog_global_filter_kw_get(void); #endif /* ULOG_USING_FILTER */ /* diff --git a/components/utilities/ulog/ulog_def.h b/components/utilities/ulog/ulog_def.h index 84b2fccc79..8df3dd2087 100644 --- a/components/utilities/ulog/ulog_def.h +++ b/components/utilities/ulog/ulog_def.h @@ -165,6 +165,15 @@ extern "C" { #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') */ From 2ff67c932f161dfcb22b68490170477be26f6952 Mon Sep 17 00:00:00 2001 From: armink Date: Thu, 8 Nov 2018 11:22:02 +0800 Subject: [PATCH 3/7] [component][ulog] Add show filter settings shell command 'ulog_filter'. --- components/utilities/ulog/ulog.c | 50 ++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/components/utilities/ulog/ulog.c b/components/utilities/ulog/ulog.c index ceb0b40ec2..54c4c7c264 100644 --- a/components/utilities/ulog/ulog.c +++ b/components/utilities/ulog/ulog.c @@ -1044,6 +1044,56 @@ static void ulog_kw(uint8_t argc, char **argv) } } MSH_CMD_EXPORT(ulog_kw, Set ulog global filter keyword); + +static void ulog_filter(uint8_t argc, char **argv) +{ +#ifndef ULOG_USING_SYSLOG + const char *lvl_name[] = { "Assert ", "Error ", "Error ", "Error ", "Warning", "Info ", "Info ", "Debug " }; +#endif + const char *tag = ulog_global_filter_tag_get(), *kw = ulog_global_filter_kw_get(); + rt_slist_t *node; + ulog_tag_lvl_filter_t tag_lvl = NULL; + + rt_kprintf("--------------------------------------\n"); + rt_kprintf("ulog global filter:\n"); + +#ifndef ULOG_USING_SYSLOG + rt_kprintf("level : %s\n", lvl_name[ulog_global_filter_lvl_get()]); +#else + rt_kprintf("level : %d\n", ulog_global_filter_lvl_get()); +#endif + + rt_kprintf("tag : %s\n", rt_strlen(tag) == 0 ? "NULL" : tag); + rt_kprintf("keyword : %s\n", rt_strlen(kw) == 0 ? "NULL" : kw); + + rt_kprintf("--------------------------------------\n"); + rt_kprintf("ulog tag's level filter:\n"); + if (rt_slist_isempty(ulog_tag_lvl_list_get())) + { + rt_kprintf("settings not found\n"); + } + else + { + /* lock output */ + output_lock(); + /* find the tag in list */ + for (node = rt_slist_first(ulog_tag_lvl_list_get()); node; node = rt_slist_next(node)) + { + tag_lvl = rt_slist_entry(node, struct ulog_tag_lvl_filter, list); + rt_kprintf("%-*.s: ", ULOG_FILTER_TAG_MAX_LEN, tag_lvl->tag); + +#ifndef ULOG_USING_SYSLOG + rt_kprintf("%s\n", lvl_name[tag_lvl->level]); +#else + rt_kprintf("%d\n", tag_lvl->level); +#endif + + } + /* unlock output */ + output_unlock(); + } +} +MSH_CMD_EXPORT(ulog_filter, Show ulog filter settings); #endif /* defined(RT_USING_FINSH) && defined(FINSH_USING_MSH) */ #endif /* ULOG_USING_FILTER */ From c990f0a026d5143c0e73cf8d21a30d60a4a81308 Mon Sep 17 00:00:00 2001 From: armink Date: Thu, 8 Nov 2018 11:23:03 +0800 Subject: [PATCH 4/7] [component][ulog] Add tag filter to hexdump function. --- components/utilities/ulog/ulog.c | 15 ++++++++++----- components/utilities/ulog/ulog.h | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/components/utilities/ulog/ulog.c b/components/utilities/ulog/ulog.c index 54c4c7c264..e7dd665f42 100644 --- a/components/utilities/ulog/ulog.c +++ b/components/utilities/ulog/ulog.c @@ -625,17 +625,17 @@ void ulog_raw(const char *format, ...) /** * dump the hex format data to log * - * @param name name for hex object, it will show on log header + * @param tag name for hex object, it will show on log header * @param width hex number for every line, such as: 16, 32 * @param buf hex buffer * @param size buffer size */ -void ulog_hexdump(const char *name, rt_size_t width, rt_uint8_t *buf, rt_size_t size) +void ulog_hexdump(const char *tag, rt_size_t width, rt_uint8_t *buf, rt_size_t size) { #define __is_print(ch) ((unsigned int)((ch) - ' ') < 127u - ' ') rt_size_t i, j; - rt_size_t log_len = 0, name_len = rt_strlen(name); + rt_size_t log_len = 0, name_len = rt_strlen(tag); char *log_buf = NULL, dump_string[8]; int fmt_result; @@ -644,7 +644,7 @@ void ulog_hexdump(const char *name, rt_size_t width, rt_uint8_t *buf, rt_size_t #ifdef ULOG_USING_FILTER /* level filter */ #ifndef ULOG_USING_SYSLOG - if (LOG_LVL_DBG > ulog.filter.level) + if (LOG_LVL_DBG > ulog.filter.level || LOG_LVL_DBG > ulog_tag_lvl_filter_get(tag)) { return; } @@ -654,6 +654,11 @@ void ulog_hexdump(const char *name, rt_size_t width, rt_uint8_t *buf, rt_size_t return; } #endif /* ULOG_USING_SYSLOG */ + else if (!rt_strstr(tag, ulog.filter.tag)) + { + /* tag filter */ + return; + } #endif /* ULOG_USING_FILTER */ /* get log buffer */ @@ -668,7 +673,7 @@ void ulog_hexdump(const char *name, rt_size_t width, rt_uint8_t *buf, rt_size_t if (i == 0) { log_len += ulog_strcpy(log_len, log_buf + log_len, "D/HEX "); - log_len += ulog_strcpy(log_len, log_buf + log_len, name); + log_len += ulog_strcpy(log_len, log_buf + log_len, tag); log_len += ulog_strcpy(log_len, log_buf + log_len, ": "); } else diff --git a/components/utilities/ulog/ulog.h b/components/utilities/ulog/ulog.h index ad0525c9a2..ab203602bc 100644 --- a/components/utilities/ulog/ulog.h +++ b/components/utilities/ulog/ulog.h @@ -83,7 +83,7 @@ void ulog_async_waiting_log(rt_int32_t time); /* * dump the hex format data to log */ -void ulog_hexdump(const char *name, rt_size_t width, rt_uint8_t *buf, rt_size_t size); +void ulog_hexdump(const char *tag, rt_size_t width, rt_uint8_t *buf, rt_size_t size); /* * Another log output API. This API is more difficult to use than LOG_X API. From 6a165e5cb125f8babd8bc0e3c56a4aaf433d8191 Mon Sep 17 00:00:00 2001 From: armink Date: Thu, 8 Nov 2018 11:27:18 +0800 Subject: [PATCH 5/7] [component][ulog] Update version to 0.1.1 . --- components/utilities/Kconfig | 2 +- components/utilities/ulog/ulog.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/components/utilities/Kconfig b/components/utilities/Kconfig index db7341e7a7..e830d94578 100644 --- a/components/utilities/Kconfig +++ b/components/utilities/Kconfig @@ -225,7 +225,7 @@ config RT_USING_ULOG config ULOG_SW_VERSION_NUM hex - default 0x00100 + default 0x00101 help sfotware module version number endif diff --git a/components/utilities/ulog/ulog.h b/components/utilities/ulog/ulog.h index ab203602bc..792c098568 100644 --- a/components/utilities/ulog/ulog.h +++ b/components/utilities/ulog/ulog.h @@ -18,7 +18,7 @@ extern "C" { #endif -#define ULOG_VERSION_STR "0.1.0" +#define ULOG_VERSION_STR "0.1.1" /* * ulog init and deint From acfe61b501b25d57a7f669eddacaf09a4ba4695c Mon Sep 17 00:00:00 2001 From: armink Date: Fri, 9 Nov 2018 09:19:44 +0800 Subject: [PATCH 6/7] [component][ulog] Fix some comments. --- components/utilities/ulog/ulog.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/components/utilities/ulog/ulog.c b/components/utilities/ulog/ulog.c index e7dd665f42..0ddc4c0da1 100644 --- a/components/utilities/ulog/ulog.c +++ b/components/utilities/ulog/ulog.c @@ -750,8 +750,9 @@ void ulog_hexdump(const char *tag, rt_size_t width, rt_uint8_t *buf, rt_size_t s * When the level is LOG_FILTER_LVL_ALL, it will remove this tag's level filer. * Then all level log will resume output. * - * @return 0: success - * -5: no memory + * @return 0 : success + * -5 : no memory + * -10: level is out of range */ int ulog_tag_lvl_filter_set(const char *tag, rt_uint32_t level) { @@ -759,7 +760,8 @@ int ulog_tag_lvl_filter_set(const char *tag, rt_uint32_t level) ulog_tag_lvl_filter_t tag_lvl = NULL; int result = RT_EOK; - RT_ASSERT(level <= LOG_FILTER_LVL_ALL); + if (level >= LOG_FILTER_LVL_ALL) + return -RT_EINVAL; if (!ulog.init_ok) return result; @@ -767,7 +769,7 @@ int ulog_tag_lvl_filter_set(const char *tag, rt_uint32_t level) /* lock output */ output_lock(); /* find the tag in list */ - for (node = rt_slist_first(&ulog.filter.tag_lvl_list); node; node = rt_slist_next(node)) + for (node = rt_slist_first(ulog_tag_lvl_list_get()); node; node = rt_slist_next(node)) { tag_lvl = rt_slist_entry(node, struct ulog_tag_lvl_filter, list); if (!rt_strncmp(tag_lvl->tag, tag, ULOG_FILTER_TAG_MAX_LEN)) @@ -785,7 +787,7 @@ int ulog_tag_lvl_filter_set(const char *tag, rt_uint32_t level) if (level == LOG_FILTER_LVL_ALL) { /* remove current tag's level filter when input level is the lowest level */ - rt_slist_remove(&ulog.filter.tag_lvl_list, &tag_lvl->list); + rt_slist_remove(ulog_tag_lvl_list_get(), &tag_lvl->list); rt_free(tag_lvl); } else @@ -806,7 +808,7 @@ int ulog_tag_lvl_filter_set(const char *tag, rt_uint32_t level) rt_memset(tag_lvl->tag, 0 , sizeof(tag_lvl->tag)); rt_strncpy(tag_lvl->tag, tag, ULOG_FILTER_TAG_MAX_LEN); tag_lvl->level = level; - rt_slist_append(&ulog.filter.tag_lvl_list, &tag_lvl->list); + rt_slist_append(ulog_tag_lvl_list_get(), &tag_lvl->list); } else { @@ -840,7 +842,7 @@ rt_uint32_t ulog_tag_lvl_filter_get(const char *tag) /* lock output */ output_lock(); /* find the tag in list */ - for (node = rt_slist_first(&ulog.filter.tag_lvl_list); node; node = rt_slist_next(node)) + for (node = rt_slist_first(ulog_tag_lvl_list_get()); node; node = rt_slist_next(node)) { tag_lvl = rt_slist_entry(node, struct ulog_tag_lvl_filter, list); if (!rt_strncmp(tag_lvl->tag, tag, ULOG_FILTER_TAG_MAX_LEN)) @@ -1081,7 +1083,7 @@ static void ulog_filter(uint8_t argc, char **argv) { /* lock output */ output_lock(); - /* find the tag in list */ + /* show the tag level list */ for (node = rt_slist_first(ulog_tag_lvl_list_get()); node; node = rt_slist_next(node)) { tag_lvl = rt_slist_entry(node, struct ulog_tag_lvl_filter, list); @@ -1225,7 +1227,7 @@ int ulog_init(void) rt_slist_init(&ulog.backend_list); #ifdef ULOG_USING_FILTER - rt_slist_init(&ulog.filter.tag_lvl_list); + rt_slist_init(ulog_tag_lvl_list_get()); #endif #ifdef ULOG_USING_ASYNC_OUTPUT @@ -1287,7 +1289,7 @@ void ulog_deinit(void) /* deinit tag's level filter */ { ulog_tag_lvl_filter_t tag_lvl; - for (node = rt_slist_first(&ulog.filter.tag_lvl_list); node; node = rt_slist_next(node)) + for (node = rt_slist_first(ulog_tag_lvl_list_get()); node; node = rt_slist_next(node)) { tag_lvl = rt_slist_entry(node, struct ulog_tag_lvl_filter, list); rt_free(tag_lvl); From f28b9d83f7a0a3561ec3a871e46f3da4b0b48fc0 Mon Sep 17 00:00:00 2001 From: armink Date: Fri, 9 Nov 2018 17:31:40 +0800 Subject: [PATCH 7/7] [component][ulog] Fix a compile error when timestamp is enable. --- components/utilities/ulog/ulog.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/utilities/ulog/ulog.c b/components/utilities/ulog/ulog.c index 0ddc4c0da1..2ed8527713 100644 --- a/components/utilities/ulog/ulog.c +++ b/components/utilities/ulog/ulog.c @@ -21,7 +21,7 @@ #endif #ifdef ULOG_TIME_USING_TIMESTAMP -#include +#include #endif #ifdef ULOG_USING_ASYNC_OUTPUT