From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 9A11CA054F; Mon, 15 Mar 2021 11:19:57 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id BD18624261C; Mon, 15 Mar 2021 11:19:56 +0100 (CET) Received: from dal3relay53.mxroute.com (dal3relay53.mxroute.com [64.40.27.53]) by mails.dpdk.org (Postfix) with ESMTP id 21FFD24261C for ; Mon, 15 Mar 2021 11:19:54 +0100 (CET) Received: from filter004.mxroute.com ([149.28.56.236] filter004.mxroute.com) (Authenticated sender: mN4UYu2MZsgR) by dal3relay53.mxroute.com (ZoneMTA) with ESMTPSA id 17835662a5400092ce.001 for (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES128-GCM-SHA256); Mon, 15 Mar 2021 10:19:51 +0000 X-Zone-Loop: ebb98e5f7dbb888957f328e371d48648d1c9d7fc5b27 X-Originating-IP: [149.28.56.236] DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=ashroe.eu; s=x; h=Content-Transfer-Encoding:Content-Type:In-Reply-To:MIME-Version:Date: Message-ID:From:References:Cc:To:Subject:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=+1PNmszdCgmQ/KcfKfR77yxzRWIMZl4pE1d46Dar+jU=; b=ci/xxktv/qqJndIT+rDuB2DBTu v/jkByWFNFkohBtqTFDq9569tB4xTynN0M9ebkwYqTkd+8htpjBSuzOPF1OIH3Vlmq/Rv/8cH7+Ym GEo5zpadEMcwFD6Q0ZKMd6rDcFk82THJ9Lx1Un8e46kZ8z8zLtKyUxzaipY+mib4bpODABhPGmBwO KTRL/TpSjna0xDfrS6pouG8FYQWjJIkw5XWzf3c+e92d4ukrh2HAA0mzSjKYzVyCVOLB8/p5db0I9 3GBClwv/M/9pnzvZX3NcCSwg9xHcbLkMBjCa4ghGwZeXwjqvpKgEDzG1Gj5CSuhDs942mu3sPXHWE VEQhcv+w==; To: Thomas Monjalon , dev@dpdk.org Cc: david.marchand@redhat.com, bruce.richardson@intel.com, mb@smartsharesystems.com, Neil Horman References: <20210309233116.1934666-1-thomas@monjalon.net> <20210312181720.242252-1-thomas@monjalon.net> <20210312181720.242252-8-thomas@monjalon.net> From: "Kinsella, Ray" Message-ID: <44934eac-9808-ada4-fe97-7d24382bced4@ashroe.eu> Date: Mon, 15 Mar 2021 10:19:47 +0000 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.8.0 MIME-Version: 1.0 In-Reply-To: <20210312181720.242252-8-thomas@monjalon.net> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit X-AuthUser: mdr@ashroe.eu Subject: Re: [dpdk-dev] [PATCH v3 07/11] eal: add log level help X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" On 12/03/2021 18:17, Thomas Monjalon wrote: > The option --log-level was not completely described in the usage text, > and it was difficult to guess the names of the log types and levels. > > A new value "help" is accepted after --log-level to give more details > about the syntax and listing the log types and levels. > > The array "levels" used for level name parsing is replaced with > a (modified) existing function which was used in rte_log_dump(). > > The new function rte_log_list_types() is exported in the API > for allowing an application to give this info to the user > if not exposing the EAL option --log-level. > The list of log types cannot include all drivers if not linked in the > application (shared object plugin case). > > Signed-off-by: Thomas Monjalon > --- > lib/librte_eal/common/eal_common_log.c | 24 +++++++++--- > lib/librte_eal/common/eal_common_options.c | 44 +++++++++++++++------- > lib/librte_eal/common/eal_log.h | 5 +++ > lib/librte_eal/include/rte_log.h | 11 ++++++ > lib/librte_eal/version.map | 3 ++ > 5 files changed, 69 insertions(+), 18 deletions(-) > > diff --git a/lib/librte_eal/common/eal_common_log.c b/lib/librte_eal/common/eal_common_log.c > index 40cac36f89..d695b04068 100644 > --- a/lib/librte_eal/common/eal_common_log.c > +++ b/lib/librte_eal/common/eal_common_log.c > @@ -397,12 +397,12 @@ RTE_INIT_PRIO(log_init, LOG) > rte_logs.dynamic_types_len = RTE_LOGTYPE_FIRST_EXT_ID; > } > > -static const char * > -loglevel_to_string(uint32_t level) > +const char * > +eal_log_level2str(uint32_t level) > { > switch (level) { > case 0: return "disabled"; > - case RTE_LOG_EMERG: return "emerg"; > + case RTE_LOG_EMERG: return "emergency"; > case RTE_LOG_ALERT: return "alert"; > case RTE_LOG_CRIT: return "critical"; > case RTE_LOG_ERR: return "error"; > @@ -414,6 +414,20 @@ loglevel_to_string(uint32_t level) > } > } > > +/* Dump name of each logtype, one per line. */ > +void > +rte_log_list_types(FILE *out, const char *prefix) > +{ > + size_t type; > + > + for (type = 0; type < rte_logs.dynamic_types_len; ++type) { > + if (rte_logs.dynamic_types[type].name == NULL) > + continue; > + fprintf(out, "%s%s\n", > + prefix, rte_logs.dynamic_types[type].name); > + } > +} > + > /* dump global level and registered log types */ > void > rte_log_dump(FILE *f) > @@ -421,14 +435,14 @@ rte_log_dump(FILE *f) > size_t i; > > fprintf(f, "global log level is %s\n", > - loglevel_to_string(rte_log_get_global_level())); > + eal_log_level2str(rte_log_get_global_level())); > > for (i = 0; i < rte_logs.dynamic_types_len; i++) { > if (rte_logs.dynamic_types[i].name == NULL) > continue; > fprintf(f, "id %zu: %s, level is %s\n", > i, rte_logs.dynamic_types[i].name, > - loglevel_to_string(rte_logs.dynamic_types[i].loglevel)); > + eal_log_level2str(rte_logs.dynamic_types[i].loglevel)); > } > } > > diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c > index 2df3ae04ea..1da6583d71 100644 > --- a/lib/librte_eal/common/eal_common_options.c > +++ b/lib/librte_eal/common/eal_common_options.c > @@ -1227,19 +1227,31 @@ eal_parse_syslog(const char *facility, struct internal_config *conf) > } > #endif > > +static void > +eal_log_usage(void) > +{ > + unsigned int level; > + > + printf("Log type is a pattern matching items of this list" > + " (plugins may be missing):\n"); > + rte_log_list_types(stdout, "\t"); > + printf("\n"); > + printf("Syntax using globbing pattern: "); > + printf("--"OPT_LOG_LEVEL" pattern:level\n"); > + printf("Syntax using regular expression: "); > + printf("--"OPT_LOG_LEVEL" regexp,level\n"); > + printf("Syntax for the global level: "); > + printf("--"OPT_LOG_LEVEL" level\n"); > + printf("Logs are emitted if allowed by both global and specific levels.\n"); > + printf("\n"); > + printf("Log level can be a number or the first letters of its name:\n"); > + for (level = 1; level <= RTE_LOG_MAX; level++) > + printf("\t%d %s\n", level, eal_log_level2str(level)); > +} > + > static int > eal_parse_log_priority(const char *level) > { > - static const char * const levels[] = { > - [RTE_LOG_EMERG] = "emergency", > - [RTE_LOG_ALERT] = "alert", > - [RTE_LOG_CRIT] = "critical", > - [RTE_LOG_ERR] = "error", > - [RTE_LOG_WARNING] = "warning", > - [RTE_LOG_NOTICE] = "notice", > - [RTE_LOG_INFO] = "info", > - [RTE_LOG_DEBUG] = "debug", > - }; > size_t len = strlen(level); > unsigned long tmp; > char *end; > @@ -1250,7 +1262,7 @@ eal_parse_log_priority(const char *level) > > /* look for named values, skip 0 which is not a valid level */ > for (i = 1; i <= RTE_LOG_MAX; i++) { > - if (strncmp(levels[i], level, len) == 0) > + if (strncmp(eal_log_level2str(i), level, len) == 0) > return i; > } > > @@ -1274,6 +1286,11 @@ eal_parse_log_level(const char *arg) > char *str, *level; > int priority; > > + if (strcmp(arg, "help") == 0) { So I think the convention is to support both "?" and "help". Qemu does this at least. > + eal_log_usage(); > + exit(EXIT_SUCCESS); > + } > + > str = strdup(arg); > if (str == NULL) > return -1; > @@ -2067,9 +2084,10 @@ eal_common_usage(void) > #ifndef RTE_EXEC_ENV_WINDOWS > " --"OPT_SYSLOG" Set syslog facility\n" > #endif > - " --"OPT_LOG_LEVEL"= Set global log level\n" > - " --"OPT_LOG_LEVEL"=:\n" > + " --"OPT_LOG_LEVEL"= Set global log level\n" > + " --"OPT_LOG_LEVEL"=:\n" > " Set specific log level\n" > + " --"OPT_LOG_LEVEL"=help Show log types and levels\n" > #ifndef RTE_EXEC_ENV_WINDOWS > " --"OPT_TRACE"=\n" > " Enable trace based on regular expression trace name.\n" > diff --git a/lib/librte_eal/common/eal_log.h b/lib/librte_eal/common/eal_log.h > index 684650a17b..c784fa6043 100644 > --- a/lib/librte_eal/common/eal_log.h > +++ b/lib/librte_eal/common/eal_log.h > @@ -24,4 +24,9 @@ void eal_log_set_default(FILE *default_log); > int eal_log_save_regexp(const char *regexp, uint32_t level); > int eal_log_save_pattern(const char *pattern, uint32_t level); > > +/* > + * Convert log level to string. > + */ > +const char *eal_log_level2str(uint32_t level); > + > #endif /* EAL_LOG_H */ > diff --git a/lib/librte_eal/include/rte_log.h b/lib/librte_eal/include/rte_log.h > index 394e8682b9..e6192892c3 100644 > --- a/lib/librte_eal/include/rte_log.h > +++ b/lib/librte_eal/include/rte_log.h > @@ -240,6 +240,17 @@ int rte_log_register(const char *name); > __rte_experimental > int rte_log_register_type_and_pick_level(const char *name, uint32_t level_def); > > +/** > + * Dump name of each logtype, one per line. > + * > + * @param out > + * Stream where the list is sent. > + * @param prefix > + * String preceding each logtype in the output. > + */ > +__rte_experimental > +void rte_log_list_types(FILE *out, const char *prefix); > + > /** > * Dump log information. > * > diff --git a/lib/librte_eal/version.map b/lib/librte_eal/version.map > index fce90a112f..6b7876a0b9 100644 > --- a/lib/librte_eal/version.map > +++ b/lib/librte_eal/version.map > @@ -412,6 +412,9 @@ EXPERIMENTAL { > rte_thread_tls_key_delete; > rte_thread_tls_value_get; > rte_thread_tls_value_set; > + > + # added in 21.05 > + rte_log_list_types; > }; > > INTERNAL { >