* [dpdk-dev] [PATCH v2 0/5] logging enhancements
@ 2018-04-24 16:58 Stephen Hemminger
2018-04-24 16:58 ` [dpdk-dev] [PATCH v2 1/5] eal: make syslog facility table const Stephen Hemminger
` (4 more replies)
0 siblings, 5 replies; 9+ messages in thread
From: Stephen Hemminger @ 2018-04-24 16:58 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger
This patch set improves the log-level option in EAL.
It adds symbolic names for log levels (error, info, debug, etc)
and shell style matching of log levels.
--log-level='pmd.ixgbe.*:debug'
The original syntax (which is maintained for compatibility)
used numeric values, comma as separator and regular expression
to match log level.
It was often documented as:
--log-level='pmd.ixgbe.*,8' ...
but this only worked by accident. The period was really
a regular expression match any character (not match a period);
and the asterisk in regular expression is match repeated value.
v2
- make facility table constant
- rebase to include support for dynamic log late binding
- add patch to make saving log level a private API
- update driver docs
Stephen Hemminger (5):
eal: make syslog facility table const
eal: allow symbolic log levels
eal: make eal_log_level save private
log: add ability to match dynamic log based on shell pattern
doc: update guides for current preferrred log level syntax
doc/guides/contributing/coding_style.rst | 2 +-
doc/guides/cryptodevs/dpaa2_sec.rst | 2 +-
doc/guides/cryptodevs/dpaa_sec.rst | 2 +-
doc/guides/faq/faq.rst | 23 ++---
doc/guides/nics/dpaa2.rst | 4 +-
doc/guides/nics/qede.rst | 2 +-
doc/guides/nics/sfc_efx.rst | 12 +--
doc/guides/nics/tap.rst | 2 +-
lib/librte_eal/common/eal_common_log.c | 103 ++++++++++++++++---
lib/librte_eal/common/eal_common_options.c | 113 +++++++++++++--------
lib/librte_eal/common/eal_private.h | 6 ++
lib/librte_eal/common/include/rte_log.h | 44 +++-----
12 files changed, 203 insertions(+), 112 deletions(-)
--
2.17.0
^ permalink raw reply [flat|nested] 9+ messages in thread
* [dpdk-dev] [PATCH v2 1/5] eal: make syslog facility table const
2018-04-24 16:58 [dpdk-dev] [PATCH v2 0/5] logging enhancements Stephen Hemminger
@ 2018-04-24 16:58 ` Stephen Hemminger
2018-04-24 16:58 ` [dpdk-dev] [PATCH v2 2/5] eal: allow symbolic log levels Stephen Hemminger
` (3 subsequent siblings)
4 siblings, 0 replies; 9+ messages in thread
From: Stephen Hemminger @ 2018-04-24 16:58 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger
The mapping fro facility name to value can be const.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
lib/librte_eal/common/eal_common_options.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c
index 40c5b26f3c1d..0e6adcb9ddb5 100644
--- a/lib/librte_eal/common/eal_common_options.c
+++ b/lib/librte_eal/common/eal_common_options.c
@@ -881,7 +881,7 @@ static int
eal_parse_syslog(const char *facility, struct internal_config *conf)
{
int i;
- static struct {
+ static const struct {
const char *name;
int value;
} map[] = {
--
2.17.0
^ permalink raw reply [flat|nested] 9+ messages in thread
* [dpdk-dev] [PATCH v2 2/5] eal: allow symbolic log levels
2018-04-24 16:58 [dpdk-dev] [PATCH v2 0/5] logging enhancements Stephen Hemminger
2018-04-24 16:58 ` [dpdk-dev] [PATCH v2 1/5] eal: make syslog facility table const Stephen Hemminger
@ 2018-04-24 16:58 ` Stephen Hemminger
2018-04-24 16:58 ` [dpdk-dev] [PATCH v2 3/5] eal: make eal_log_level save private Stephen Hemminger
` (2 subsequent siblings)
4 siblings, 0 replies; 9+ messages in thread
From: Stephen Hemminger @ 2018-04-24 16:58 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger
Much easeier to remember names than numbers. Allows
--log-level=pmd.net.ixgbe.*,debug
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
lib/librte_eal/common/eal_common_options.c | 67 ++++++++++++++++------
1 file changed, 50 insertions(+), 17 deletions(-)
diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c
index 0e6adcb9ddb5..13c05bbe9b70 100644
--- a/lib/librte_eal/common/eal_common_options.c
+++ b/lib/librte_eal/common/eal_common_options.c
@@ -917,10 +917,49 @@ eal_parse_syslog(const char *facility, struct internal_config *conf)
}
static int
-eal_parse_log_level(const char *arg)
+eal_parse_log_priority(const char *level)
{
- char *end, *str, *type, *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;
+ unsigned int i;
+
+ if (len == 0)
+ return -1;
+
+ /* look for named values, skip 0 which is not a valid level */
+ for (i = 1; i < RTE_DIM(levels); i++) {
+ if (strncmp(levels[i], level, len) == 0)
+ return i;
+ }
+
+ /* not a string, maybe it is numeric */
+ errno = 0;
+ tmp = strtoul(level, &end, 0);
+
+ /* check for errors */
+ if (errno != 0 || end == NULL || *end != '\0' ||
+ tmp >= UINT32_MAX)
+ return -1;
+
+ return tmp;
+}
+
+static int
+eal_parse_log_level(const char *arg)
+{
+ char *str, *type, *level;
+ int priority;
str = strdup(arg);
if (str == NULL)
@@ -934,23 +973,17 @@ eal_parse_log_level(const char *arg)
level = strsep(&str, ",");
}
- errno = 0;
- tmp = strtoul(level, &end, 0);
-
- /* check for errors */
- if ((errno != 0) || (level[0] == '\0') ||
- end == NULL || (*end != '\0'))
- goto fail;
-
- /* log_level is a uint32_t */
- if (tmp >= UINT32_MAX)
+ priority = eal_parse_log_priority(level);
+ if (priority < 0) {
+ fprintf(stderr, "invalid log priority: %s\n", level);
goto fail;
+ }
if (type == NULL) {
- rte_log_set_global_level(tmp);
- } else if (rte_log_set_level_regexp(type, tmp) < 0) {
- printf("cannot set log level %s,%lu\n",
- type, tmp);
+ rte_log_set_global_level(priority);
+ } else if (rte_log_set_level_regexp(type, priority) < 0) {
+ fprintf(stderr, "cannot set log level %s,%d\n",
+ type, priority);
goto fail;
} else {
struct rte_eal_opt_loglevel *opt_ll;
@@ -972,7 +1005,7 @@ eal_parse_log_level(const char *arg)
goto fail;
}
- opt_ll->level = tmp;
+ opt_ll->level = priority;
TAILQ_INSERT_HEAD(&opt_loglevel_list, opt_ll, next);
}
--
2.17.0
^ permalink raw reply [flat|nested] 9+ messages in thread
* [dpdk-dev] [PATCH v2 3/5] eal: make eal_log_level save private
2018-04-24 16:58 [dpdk-dev] [PATCH v2 0/5] logging enhancements Stephen Hemminger
2018-04-24 16:58 ` [dpdk-dev] [PATCH v2 1/5] eal: make syslog facility table const Stephen Hemminger
2018-04-24 16:58 ` [dpdk-dev] [PATCH v2 2/5] eal: allow symbolic log levels Stephen Hemminger
@ 2018-04-24 16:58 ` Stephen Hemminger
2018-04-24 23:55 ` Thomas Monjalon
2018-04-24 16:58 ` [dpdk-dev] [PATCH v2 4/5] log: add ability to match dynamic log based on shell pattern Stephen Hemminger
2018-04-24 16:58 ` [dpdk-dev] [PATCH v2 5/5] doc: update guides for current preferrred log level syntax Stephen Hemminger
4 siblings, 1 reply; 9+ messages in thread
From: Stephen Hemminger @ 2018-04-24 16:58 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger
We don't want format of eal log level saved values to be visible
in ABI. Move to private storage in eal_common_log.
Includes minor optimization. Compile the regular expression for
each log match once, rather than each time it is used.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
lib/librte_eal/common/eal_common_log.c | 51 +++++++++++++++++-----
lib/librte_eal/common/eal_common_options.c | 26 ++---------
lib/librte_eal/common/eal_private.h | 5 +++
lib/librte_eal/common/include/rte_log.h | 26 -----------
4 files changed, 49 insertions(+), 59 deletions(-)
diff --git a/lib/librte_eal/common/eal_common_log.c b/lib/librte_eal/common/eal_common_log.c
index a27192620d9e..c47e53b3db74 100644
--- a/lib/librte_eal/common/eal_common_log.c
+++ b/lib/librte_eal/common/eal_common_log.c
@@ -23,8 +23,19 @@ struct rte_logs rte_logs = {
.file = NULL,
};
-/** Global list of valid EAL log level options */
-struct rte_eal_opt_loglevel_list opt_loglevel_list =
+struct rte_eal_opt_loglevel {
+ /** Next list entry */
+ TAILQ_ENTRY(rte_eal_opt_loglevel) next;
+ /** Compiled regular expression obtained from the option */
+ regex_t re_match;
+ /** Log level value obtained from the option */
+ uint32_t level;
+};
+
+TAILQ_HEAD(rte_eal_opt_loglevel_list, rte_eal_opt_loglevel);
+
+/** List of valid EAL log level options */
+static struct rte_eal_opt_loglevel_list opt_loglevel_list =
TAILQ_HEAD_INITIALIZER(opt_loglevel_list);
/* Stream to use for logging if rte_logs.file is NULL */
@@ -119,6 +130,33 @@ rte_log_set_level_regexp(const char *pattern, uint32_t level)
return 0;
}
+/*
+ * Save the type (regexp string) and the loglevel
+ * in the global storage so that it could be used
+ * to configure dynamic logtypes which are absent
+ * at the moment of EAL option processing but may
+ * be registered during runtime.
+ */
+int rte_eal_log_save_regexp(const char *regex, int tmp)
+{
+ struct rte_eal_opt_loglevel *opt_ll;
+
+ opt_ll = malloc(sizeof(*opt_ll));
+ if (opt_ll == NULL)
+ return -1;
+
+ if (regcomp(&opt_ll->re_match, regex, 0) != 0)
+ goto fail;
+
+ opt_ll->level = tmp;
+
+ TAILQ_INSERT_HEAD(&opt_loglevel_list, opt_ll, next);
+ return 0;
+fail:
+ free(opt_ll);
+ return -1;
+}
+
/* get the current loglevel for the message being processed */
int rte_log_cur_msg_loglevel(void)
{
@@ -203,18 +241,11 @@ rte_log_register_type_and_pick_level(const char *name, uint32_t level_def)
return type;
TAILQ_FOREACH(opt_ll, &opt_loglevel_list, next) {
- regex_t r;
-
if (opt_ll->level > RTE_LOG_DEBUG)
continue;
- if (regcomp(&r, opt_ll->re_type, 0) != 0)
- continue;
-
- if (regexec(&r, name, 0, NULL, 0) == 0)
+ if (regexec(&opt_ll->re_match, name, 0, NULL, 0) == 0)
level = opt_ll->level;
-
- regfree(&r);
}
rte_logs.dynamic_types[type].loglevel = level;
diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c
index 13c05bbe9b70..038e75d86348 100644
--- a/lib/librte_eal/common/eal_common_options.c
+++ b/lib/librte_eal/common/eal_common_options.c
@@ -27,6 +27,7 @@
#include "eal_internal_cfg.h"
#include "eal_options.h"
#include "eal_filesystem.h"
+#include "eal_private.h"
#define BITS_PER_HEX 4
#define LCORE_OPT_LST 1
@@ -985,29 +986,8 @@ eal_parse_log_level(const char *arg)
fprintf(stderr, "cannot set log level %s,%d\n",
type, priority);
goto fail;
- } else {
- struct rte_eal_opt_loglevel *opt_ll;
-
- /*
- * Save the type (regexp string) and the loglevel
- * in the global storage so that it could be used
- * to configure dynamic logtypes which are absent
- * at the moment of EAL option processing but may
- * be registered during runtime.
- */
- opt_ll = malloc(sizeof(*opt_ll));
- if (opt_ll == NULL)
- goto fail;
-
- opt_ll->re_type = strdup(type);
- if (opt_ll->re_type == NULL) {
- free(opt_ll);
- goto fail;
- }
-
- opt_ll->level = priority;
-
- TAILQ_INSERT_HEAD(&opt_loglevel_list, opt_ll, next);
+ } else if (rte_eal_log_save_regexp(type, priority) < 0) {
+ goto fail;
}
free(str);
diff --git a/lib/librte_eal/common/eal_private.h b/lib/librte_eal/common/eal_private.h
index 6a8dde824313..d505a9a3c76f 100644
--- a/lib/librte_eal/common/eal_private.h
+++ b/lib/librte_eal/common/eal_private.h
@@ -82,6 +82,11 @@ int rte_eal_timer_init(void);
*/
int rte_eal_log_init(const char *id, int facility);
+/**
+ * Save the log regexp for later
+ */
+int rte_eal_log_save_regexp(const char *type, int priority);
+
/**
* Init tail queues for non-EAL library structures. This is to allow
* the rings, mempools, etc. lists to be shared among multiple processes
diff --git a/lib/librte_eal/common/include/rte_log.h b/lib/librte_eal/common/include/rte_log.h
index 5f4799e1b795..2d817c3da7c1 100644
--- a/lib/librte_eal/common/include/rte_log.h
+++ b/lib/librte_eal/common/include/rte_log.h
@@ -85,32 +85,6 @@ extern struct rte_logs rte_logs;
#define RTE_LOG_INFO 7U /**< Informational. */
#define RTE_LOG_DEBUG 8U /**< Debug-level messages. */
-/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice
- *
- * Entry definition for the storage to keep EAL log level options
- * which are found to have log type regular expressions specified.
- */
-struct rte_eal_opt_loglevel {
- /** Next list entry */
- TAILQ_ENTRY(rte_eal_opt_loglevel) next;
- /** Regular expression string obtained from the option */
- char *re_type;
- /** Log level value obtained from the option */
- uint32_t level;
-};
-
-TAILQ_HEAD(rte_eal_opt_loglevel_list, rte_eal_opt_loglevel);
-
-/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice
- *
- * Global list of EAL log level options featuring log type expressions
- */
-extern struct rte_eal_opt_loglevel_list opt_loglevel_list;
-
/**
* Change the stream that will be used by the logging system.
*
--
2.17.0
^ permalink raw reply [flat|nested] 9+ messages in thread
* [dpdk-dev] [PATCH v2 4/5] log: add ability to match dynamic log based on shell pattern
2018-04-24 16:58 [dpdk-dev] [PATCH v2 0/5] logging enhancements Stephen Hemminger
` (2 preceding siblings ...)
2018-04-24 16:58 ` [dpdk-dev] [PATCH v2 3/5] eal: make eal_log_level save private Stephen Hemminger
@ 2018-04-24 16:58 ` Stephen Hemminger
2018-04-25 0:02 ` Thomas Monjalon
2018-04-25 0:08 ` Thomas Monjalon
2018-04-24 16:58 ` [dpdk-dev] [PATCH v2 5/5] doc: update guides for current preferrred log level syntax Stephen Hemminger
4 siblings, 2 replies; 9+ messages in thread
From: Stephen Hemminger @ 2018-04-24 16:58 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger
Regular expressions are not the best way to match a hierarchical
pattern like dynamic log levels. And the separator for dynamic
log levels is period which is the regex wildcard character.
A better solution is to use filename matching 'globbing' so
that log levels match like file paths. For compatibility,
use colon to separate pattern match style arguments. For
example:
--log-level 'pmd.net.virtio.*:debug'
This also makes the documentation match what really happens
internally.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
doc/guides/contributing/coding_style.rst | 2 +-
doc/guides/nics/qede.rst | 2 +-
lib/librte_eal/common/eal_common_log.c | 76 +++++++++++++++++-----
lib/librte_eal/common/eal_common_options.c | 42 ++++++++----
lib/librte_eal/common/eal_private.h | 3 +-
lib/librte_eal/common/include/rte_log.h | 18 ++++-
6 files changed, 107 insertions(+), 36 deletions(-)
diff --git a/doc/guides/contributing/coding_style.rst b/doc/guides/contributing/coding_style.rst
index b0f0adb887b4..365a4b17a983 100644
--- a/doc/guides/contributing/coding_style.rst
+++ b/doc/guides/contributing/coding_style.rst
@@ -615,7 +615,7 @@ In the DPDK environment, use the logging interface provided:
rte_log_set_level(my_logtype2, RTE_LOG_NOTICE);
/* enable all PMD logs (whose identifier string starts with "pmd") */
- rte_log_set_level_regexp("pmd.*", RTE_LOG_DEBUG);
+ rte_log_set_level_match("pmd.*", RTE_LOG_DEBUG);
/* log in debug level */
rte_log_set_global_level(RTE_LOG_DEBUG);
diff --git a/doc/guides/nics/qede.rst b/doc/guides/nics/qede.rst
index 63ce9b4c60c6..42dd70db39df 100644
--- a/doc/guides/nics/qede.rst
+++ b/doc/guides/nics/qede.rst
@@ -193,7 +193,7 @@ This section provides instructions to configure SR-IOV with Linux OS.
#. Running testpmd
- (Supply ``--log-level="pmd.net.qede.driver",7`` to view informational messages):
+ (Supply ``--log-level="pmd.net.qede.driver:7`` to view informational messages):
Refer to the document
:ref:`compiling and testing a PMD for a NIC <pmd_build_and_test>` to run
diff --git a/lib/librte_eal/common/eal_common_log.c b/lib/librte_eal/common/eal_common_log.c
index c47e53b3db74..d1484dacd98f 100644
--- a/lib/librte_eal/common/eal_common_log.c
+++ b/lib/librte_eal/common/eal_common_log.c
@@ -9,6 +9,7 @@
#include <string.h>
#include <errno.h>
#include <regex.h>
+#include <fnmatch.h>
#include <rte_eal.h>
#include <rte_log.h>
@@ -28,6 +29,8 @@ struct rte_eal_opt_loglevel {
TAILQ_ENTRY(rte_eal_opt_loglevel) next;
/** Compiled regular expression obtained from the option */
regex_t re_match;
+ /** Glob match string option */
+ char *pattern;
/** Log level value obtained from the option */
uint32_t level;
};
@@ -104,9 +107,9 @@ rte_log_set_level(uint32_t type, uint32_t level)
return 0;
}
-/* set level */
+/* set log level by regular expression */
int
-rte_log_set_level_regexp(const char *pattern, uint32_t level)
+rte_log_set_level_regexp(const char *regex, uint32_t level)
{
regex_t r;
size_t i;
@@ -114,7 +117,7 @@ rte_log_set_level_regexp(const char *pattern, uint32_t level)
if (level > RTE_LOG_DEBUG)
return -1;
- if (regcomp(&r, pattern, 0) != 0)
+ if (regcomp(&r, regex, 0) != 0)
return -1;
for (i = 0; i < rte_logs.dynamic_types_len; i++) {
@@ -131,24 +134,30 @@ rte_log_set_level_regexp(const char *pattern, uint32_t level)
}
/*
- * Save the type (regexp string) and the loglevel
- * in the global storage so that it could be used
- * to configure dynamic logtypes which are absent
- * at the moment of EAL option processing but may
- * be registered during runtime.
+ * Save the type string and the loglevel for later dynamic
+ * logtypes which may register later.
*/
-int rte_eal_log_save_regexp(const char *regex, int tmp)
+static int rte_log_save_level(int priority,
+ const char *regex, const char *pattern)
{
- struct rte_eal_opt_loglevel *opt_ll;
+ struct rte_eal_opt_loglevel *opt_ll = NULL;
opt_ll = malloc(sizeof(*opt_ll));
if (opt_ll == NULL)
- return -1;
-
- if (regcomp(&opt_ll->re_match, regex, 0) != 0)
goto fail;
- opt_ll->level = tmp;
+ opt_ll->level = priority;
+
+ if (regex) {
+ opt_ll->pattern = NULL;
+ if (regcomp(&opt_ll->re_match, regex, 0) != 0)
+ goto fail;
+ } else if (pattern) {
+ opt_ll->pattern = strdup(pattern);
+ if (opt_ll->pattern == NULL)
+ goto fail;
+ } else
+ goto fail;
TAILQ_INSERT_HEAD(&opt_loglevel_list, opt_ll, next);
return 0;
@@ -157,6 +166,36 @@ int rte_eal_log_save_regexp(const char *regex, int tmp)
return -1;
}
+int rte_eal_log_save_regexp(const char *regex, int priority)
+{
+ return rte_log_save_level(priority, regex, NULL);
+}
+
+/* set log level based on glob (file match) pattern */
+int
+rte_log_set_level_pattern(const char *pattern, uint32_t level)
+{
+ size_t i;
+
+ if (level > RTE_LOG_DEBUG)
+ return -1;
+
+ for (i = 0; i < rte_logs.dynamic_types_len; i++) {
+ if (rte_logs.dynamic_types[i].name == NULL)
+ continue;
+
+ if (fnmatch(pattern, rte_logs.dynamic_types[i].name, 0))
+ rte_logs.dynamic_types[i].loglevel = level;
+ }
+
+ return 0;
+}
+
+int rte_eal_log_save_pattern(const char *pattern, int priority)
+{
+ return rte_log_save_level(priority, NULL, pattern);
+}
+
/* get the current loglevel for the message being processed */
int rte_log_cur_msg_loglevel(void)
{
@@ -244,8 +283,13 @@ rte_log_register_type_and_pick_level(const char *name, uint32_t level_def)
if (opt_ll->level > RTE_LOG_DEBUG)
continue;
- if (regexec(&opt_ll->re_match, name, 0, NULL, 0) == 0)
- level = opt_ll->level;
+ if (opt_ll->pattern) {
+ if (fnmatch(opt_ll->pattern, name, 0))
+ level = opt_ll->level;
+ } else {
+ if (regexec(&opt_ll->re_match, name, 0, NULL, 0) == 0)
+ level = opt_ll->level;
+ }
}
rte_logs.dynamic_types[type].loglevel = level;
diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c
index 038e75d86348..604aef2b56e0 100644
--- a/lib/librte_eal/common/eal_common_options.c
+++ b/lib/librte_eal/common/eal_common_options.c
@@ -959,19 +959,23 @@ eal_parse_log_priority(const char *level)
static int
eal_parse_log_level(const char *arg)
{
- char *str, *type, *level;
+ const char *pattern = NULL;
+ const char *regex = NULL;
+ char *str, *level;
int priority;
str = strdup(arg);
if (str == NULL)
return -1;
- if (strchr(str, ',') == NULL) {
- type = NULL;
- level = str;
+ if ((level = strchr(str, ','))) {
+ regex = str;
+ *level++ = '\0';
+ } else if ((level = strchr(str, ':'))) {
+ pattern = str;
+ *level++ = '\0';
} else {
- type = strsep(&str, ",");
- level = strsep(&str, ",");
+ level = str;
}
priority = eal_parse_log_priority(level);
@@ -980,14 +984,24 @@ eal_parse_log_level(const char *arg)
goto fail;
}
- if (type == NULL) {
+ if (regex) {
+ if (rte_log_set_level_regexp(regex, priority) < 0) {
+ fprintf(stderr, "cannot set log level %s,%d\n",
+ pattern, priority);
+ goto fail;
+ }
+ if (rte_eal_log_save_regexp(regex, priority) < 0)
+ goto fail;
+ } else if (pattern) {
+ if (rte_log_set_level_pattern(pattern, priority) < 0) {
+ fprintf(stderr, "cannot set log level %s:%d\n",
+ pattern, priority);
+ goto fail;
+ }
+ if (rte_eal_log_save_pattern(pattern, priority) < 0)
+ goto fail;
+ } else {
rte_log_set_global_level(priority);
- } else if (rte_log_set_level_regexp(type, priority) < 0) {
- fprintf(stderr, "cannot set log level %s,%d\n",
- type, priority);
- goto fail;
- } else if (rte_eal_log_save_regexp(type, priority) < 0) {
- goto fail;
}
free(str);
@@ -1352,7 +1366,7 @@ eal_common_usage(void)
" --"OPT_PROC_TYPE" Type of this process (primary|secondary|auto)\n"
" --"OPT_SYSLOG" Set syslog facility\n"
" --"OPT_LOG_LEVEL"=<int> Set global log level\n"
- " --"OPT_LOG_LEVEL"=<type-regexp>,<int>\n"
+ " --"OPT_LOG_LEVEL"=<type-match>:<int>\n"
" Set specific log level\n"
" -v Display version information on startup\n"
" -h, --help This help\n"
diff --git a/lib/librte_eal/common/eal_private.h b/lib/librte_eal/common/eal_private.h
index d505a9a3c76f..c2f541c169a9 100644
--- a/lib/librte_eal/common/eal_private.h
+++ b/lib/librte_eal/common/eal_private.h
@@ -85,7 +85,8 @@ int rte_eal_log_init(const char *id, int facility);
/**
* Save the log regexp for later
*/
-int rte_eal_log_save_regexp(const char *type, int priority);
+int rte_eal_log_save_regexp(const char *regex, int priority);
+int rte_eal_log_save_pattern(const char *pattern, int priority);
/**
* Init tail queues for non-EAL library structures. This is to allow
diff --git a/lib/librte_eal/common/include/rte_log.h b/lib/librte_eal/common/include/rte_log.h
index 2d817c3da7c1..2f789cb90293 100644
--- a/lib/librte_eal/common/include/rte_log.h
+++ b/lib/librte_eal/common/include/rte_log.h
@@ -130,16 +130,28 @@ uint32_t rte_log_get_global_level(void);
int rte_log_get_level(uint32_t logtype);
/**
- * Set the log level for a given type.
+ * Set the log level for a given type based on shell pattern.
*
* @param pattern
- * The regexp identifying the log type.
+ * The match pattern identifying the log type.
+ * @param level
+ * The level to be set.
+ * @return
+ * 0 on success, a negative value if level is invalid.
+ */
+int rte_log_set_level_pattern(const char *pattern, uint32_t level);
+
+/**
+ * Set the log level for a given type based on regular expression.
+ *
+ * @param regex
+ * The regular expression identifying the log type.
* @param level
* The level to be set.
* @return
* 0 on success, a negative value if level is invalid.
*/
-int rte_log_set_level_regexp(const char *pattern, uint32_t level);
+int rte_log_set_level_regexp(const char *regex, uint32_t level);
/**
* Set the log level for a given type.
--
2.17.0
^ permalink raw reply [flat|nested] 9+ messages in thread
* [dpdk-dev] [PATCH v2 5/5] doc: update guides for current preferrred log level syntax
2018-04-24 16:58 [dpdk-dev] [PATCH v2 0/5] logging enhancements Stephen Hemminger
` (3 preceding siblings ...)
2018-04-24 16:58 ` [dpdk-dev] [PATCH v2 4/5] log: add ability to match dynamic log based on shell pattern Stephen Hemminger
@ 2018-04-24 16:58 ` Stephen Hemminger
4 siblings, 0 replies; 9+ messages in thread
From: Stephen Hemminger @ 2018-04-24 16:58 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger
Use symbolic names and match rather than numbers and regex
in the guides.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
doc/guides/cryptodevs/dpaa2_sec.rst | 2 +-
doc/guides/cryptodevs/dpaa_sec.rst | 2 +-
doc/guides/faq/faq.rst | 23 ++++++++++-------------
doc/guides/nics/dpaa2.rst | 4 ++--
doc/guides/nics/qede.rst | 2 +-
doc/guides/nics/sfc_efx.rst | 12 ++++++------
doc/guides/nics/tap.rst | 2 +-
7 files changed, 22 insertions(+), 25 deletions(-)
diff --git a/doc/guides/cryptodevs/dpaa2_sec.rst b/doc/guides/cryptodevs/dpaa2_sec.rst
index 5558ea593e10..fcea48375912 100644
--- a/doc/guides/cryptodevs/dpaa2_sec.rst
+++ b/doc/guides/cryptodevs/dpaa2_sec.rst
@@ -211,7 +211,7 @@ For enabling logs, use the following EAL parameter:
.. code-block:: console
- ./your_crypto_application <EAL args> --log-level=pmd.crypto.dpaa2,<level>
+ ./your_crypto_application <EAL args> --log-level=pmd.crypto.dpaa2:<level>
Using ``crypto.dpaa2`` as log matching criteria, all Crypto PMD logs can be
enabled which are lower than logging ``level``.
diff --git a/doc/guides/cryptodevs/dpaa_sec.rst b/doc/guides/cryptodevs/dpaa_sec.rst
index 2964e83572eb..caf3d9cab2ac 100644
--- a/doc/guides/cryptodevs/dpaa_sec.rst
+++ b/doc/guides/cryptodevs/dpaa_sec.rst
@@ -154,7 +154,7 @@ For enabling logs, use the following EAL parameter:
.. code-block:: console
- ./your_crypto_application <EAL args> --log-level=pmd.crypto.dpaa,<level>
+ ./your_crypto_application <EAL args> --log-level=pmd.crypto.dpaa:<level>
Using ``pmd.crypto.dpaa`` as log matching criteria, all Crypto PMD logs can be
enabled which are lower than logging ``level``.
diff --git a/doc/guides/faq/faq.rst b/doc/guides/faq/faq.rst
index c1132fb4162f..f19c1389b6af 100644
--- a/doc/guides/faq/faq.rst
+++ b/doc/guides/faq/faq.rst
@@ -62,19 +62,16 @@ the wrong socket, the application simply will not start.
On application startup, there is a lot of EAL information printed. Is there any way to reduce this?
---------------------------------------------------------------------------------------------------
-Yes, the option ``--log-level=`` accepts one of these numbers:
-
-.. code-block:: c
-
- #define RTE_LOG_EMERG 1U /* System is unusable. */
- #define RTE_LOG_ALERT 2U /* Action must be taken immediately. */
- #define RTE_LOG_CRIT 3U /* Critical conditions. */
- #define RTE_LOG_ERR 4U /* Error conditions. */
- #define RTE_LOG_WARNING 5U /* Warning conditions. */
- #define RTE_LOG_NOTICE 6U /* Normal but significant condition. */
- #define RTE_LOG_INFO 7U /* Informational. */
- #define RTE_LOG_DEBUG 8U /* Debug-level messages. */
-
+Yes, the option ``--log-level=`` accepts either symbolic names (or numbers):
+
+1. emergency
+2. alert
+3. critical
+4. error
+5. warning
+6. notice
+7. info
+8. debug
How can I tune my network application to achieve lower latency?
---------------------------------------------------------------
diff --git a/doc/guides/nics/dpaa2.rst b/doc/guides/nics/dpaa2.rst
index 8e38efff4a27..85d26503f325 100644
--- a/doc/guides/nics/dpaa2.rst
+++ b/doc/guides/nics/dpaa2.rst
@@ -547,7 +547,7 @@ For enabling logging for DPAA2 PMD, following log-level prefix can be used:
.. code-block:: console
- <dpdk app> <EAL args> --log-level=bus.fslmc,<level> -- ...
+ <dpdk app> <EAL args> --log-level=bus.fslmc:<level> -- ...
Using ``bus.fslmc`` as log matching criteria, all FSLMC bus logs can be enabled
which are lower than logging ``level``.
@@ -556,7 +556,7 @@ which are lower than logging ``level``.
.. code-block:: console
- <dpdk app> <EAL args> --log-level=pmd.net.dpaa2,<level> -- ...
+ <dpdk app> <EAL args> --log-level=pmd.net.dpaa2:<level> -- ...
Using ``pmd.dpaa2`` as log matching criteria, all PMD logs can be enabled
which are lower than logging ``level``.
diff --git a/doc/guides/nics/qede.rst b/doc/guides/nics/qede.rst
index 42dd70db39df..f6fb548155a3 100644
--- a/doc/guides/nics/qede.rst
+++ b/doc/guides/nics/qede.rst
@@ -193,7 +193,7 @@ This section provides instructions to configure SR-IOV with Linux OS.
#. Running testpmd
- (Supply ``--log-level="pmd.net.qede.driver:7`` to view informational messages):
+ (Supply ``--log-level="pmd.net.qede.driver:info`` to view informational messages):
Refer to the document
:ref:`compiling and testing a PMD for a NIC <pmd_build_and_test>` to run
diff --git a/doc/guides/nics/sfc_efx.rst b/doc/guides/nics/sfc_efx.rst
index abaed67f52b6..07ccafaaf750 100644
--- a/doc/guides/nics/sfc_efx.rst
+++ b/doc/guides/nics/sfc_efx.rst
@@ -356,26 +356,26 @@ Dynamic Logging Parameters
One may leverage EAL option "--log-level" to change default levels
for the log types supported by the driver. The option is used with
-an argument typically consisting of two parts separated by a comma.
+an argument typically consisting of two parts separated by a colon.
-Level value is the last part which takes an integer greater than 0.
-Log type is the former part which may contain a regular expression.
+Level value is the last part which takes a symbolic name (or integer).
+Log type is the former part which may shell match syntax.
Depending on the choice of the expression, the given log level may
be used either for some specific log type or for a subset of types.
SFC EFX PMD provides the following log types available for control:
-- ``pmd.net.sfc.driver`` (default level is **6** - ``RTE_LOG_NOTICE``)
+- ``pmd.net.sfc.driver`` (default level is **notice**)
Affects driver-wide messages unrelated to any particular devices.
-- ``pmd.net.sfc.main`` (default level is **6** - ``RTE_LOG_NOTICE``)
+- ``pmd.net.sfc.main`` (default level is **notice**)
Matches a subset of per-port log types registered during runtime.
A full name for a particular type may be obtained by appending a
dot and a PCI device identifier (``XXXX:XX:XX.X``) to the prefix.
-- ``pmd.net.sfc.mcdi`` (default level is **6** - ``RTE_LOG_NOTICE``)
+- ``pmd.net.sfc.mcdi`` (default level is **notice**)
Extra logging of the communication with the NIC's management CPU.
The format of the log is consumed by the Solarflare netlogdecode
diff --git a/doc/guides/nics/tap.rst b/doc/guides/nics/tap.rst
index c97786acaa53..3e038cc5eec1 100644
--- a/doc/guides/nics/tap.rst
+++ b/doc/guides/nics/tap.rst
@@ -166,7 +166,7 @@ Run pktgen from the pktgen directory in a terminal with a commandline like the
following::
sudo ./app/app/x86_64-native-linuxapp-gcc/app/pktgen -l 1-5 -n 4 \
- --proc-type auto --log-level 8 --socket-mem 512,512 --file-prefix pg \
+ --proc-type auto --log-level debug --socket-mem 512,512 --file-prefix pg \
--vdev=net_tap0 --vdev=net_tap1 -b 05:00.0 -b 05:00.1 \
-b 04:00.0 -b 04:00.1 -b 04:00.2 -b 04:00.3 \
-b 81:00.0 -b 81:00.1 -b 81:00.2 -b 81:00.3 \
--
2.17.0
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [dpdk-dev] [PATCH v2 3/5] eal: make eal_log_level save private
2018-04-24 16:58 ` [dpdk-dev] [PATCH v2 3/5] eal: make eal_log_level save private Stephen Hemminger
@ 2018-04-24 23:55 ` Thomas Monjalon
0 siblings, 0 replies; 9+ messages in thread
From: Thomas Monjalon @ 2018-04-24 23:55 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: dev
24/04/2018 18:58, Stephen Hemminger:
> +int rte_eal_log_save_regexp(const char *regex, int tmp)
The prefix rte_log_ is preferred over rte_eal_log_.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [dpdk-dev] [PATCH v2 4/5] log: add ability to match dynamic log based on shell pattern
2018-04-24 16:58 ` [dpdk-dev] [PATCH v2 4/5] log: add ability to match dynamic log based on shell pattern Stephen Hemminger
@ 2018-04-25 0:02 ` Thomas Monjalon
2018-04-25 0:08 ` Thomas Monjalon
1 sibling, 0 replies; 9+ messages in thread
From: Thomas Monjalon @ 2018-04-25 0:02 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: dev
24/04/2018 18:58, Stephen Hemminger:
> /* enable all PMD logs (whose identifier string starts with "pmd") */
> - rte_log_set_level_regexp("pmd.*", RTE_LOG_DEBUG);
> + rte_log_set_level_match("pmd.*", RTE_LOG_DEBUG);
The function name in the doc above does not match (sic)
the new function name below.
[...]
> +int rte_log_set_level_pattern(const char *pattern, uint32_t level);
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [dpdk-dev] [PATCH v2 4/5] log: add ability to match dynamic log based on shell pattern
2018-04-24 16:58 ` [dpdk-dev] [PATCH v2 4/5] log: add ability to match dynamic log based on shell pattern Stephen Hemminger
2018-04-25 0:02 ` Thomas Monjalon
@ 2018-04-25 0:08 ` Thomas Monjalon
1 sibling, 0 replies; 9+ messages in thread
From: Thomas Monjalon @ 2018-04-25 0:08 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: dev
24/04/2018 18:58, Stephen Hemminger:
> +/* set log level based on glob (file match) pattern */
> +int
> +rte_log_set_level_pattern(const char *pattern, uint32_t level)
This new function is not listed in the map file.
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2018-04-25 0:08 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-04-24 16:58 [dpdk-dev] [PATCH v2 0/5] logging enhancements Stephen Hemminger
2018-04-24 16:58 ` [dpdk-dev] [PATCH v2 1/5] eal: make syslog facility table const Stephen Hemminger
2018-04-24 16:58 ` [dpdk-dev] [PATCH v2 2/5] eal: allow symbolic log levels Stephen Hemminger
2018-04-24 16:58 ` [dpdk-dev] [PATCH v2 3/5] eal: make eal_log_level save private Stephen Hemminger
2018-04-24 23:55 ` Thomas Monjalon
2018-04-24 16:58 ` [dpdk-dev] [PATCH v2 4/5] log: add ability to match dynamic log based on shell pattern Stephen Hemminger
2018-04-25 0:02 ` Thomas Monjalon
2018-04-25 0:08 ` Thomas Monjalon
2018-04-24 16:58 ` [dpdk-dev] [PATCH v2 5/5] doc: update guides for current preferrred log level syntax Stephen Hemminger
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).