log: track log level changes

Add a log message when registering log types and changing log levels.

__rte_log_register previous handled both legacy and dynamic logtypes.
To simplify the code, __rte_log_register is reworked to only handle
dynamic logtypes and takes a log level.

Example:
$ DPDK_TEST=logs_autotest ./build/app/test/dpdk-test --no-huge -m 512 \
  --log-level=lib.eal:debug
...
RTE>>logs_autotest
== dynamic log types
EAL: logtype1 log level changed from disabled to info
EAL: logtype2 log level changed from disabled to info
EAL: logtype1 log level changed from info to error
EAL: logtype3 log level changed from error to emergency
EAL: logtype2 log level changed from info to emergency
EAL: logtype3 log level changed from emergency to debug
EAL: logtype1 log level changed from error to debug
EAL: logtype2 log level changed from emergency to debug
error message
critical message
critical message
error message
== static log types
TESTAPP1: error message
TESTAPP1: critical message
TESTAPP2: critical message
TESTAPP1: error message
Test OK

Suggested-by: Ilya Maximets <i.maximets@ovn.org>
Signed-off-by: David Marchand <david.marchand@redhat.com>
Acked-by: Andrew Rybchenko <arybchenko@solarflare.com>
Acked-by: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
Acked-by: Thomas Monjalon <thomas@monjalon.net>
This commit is contained in:
David Marchand 2021-04-09 13:04:52 +02:00
parent 39b5717999
commit eba022b926

View File

@ -135,6 +135,21 @@ rte_log_can_log(uint32_t logtype, uint32_t level)
return true;
}
static void
logtype_set_level(uint32_t type, uint32_t level)
{
uint32_t current = rte_logs.dynamic_types[type].loglevel;
if (current != level) {
rte_logs.dynamic_types[type].loglevel = level;
RTE_LOG(DEBUG, EAL, "%s log level changed from %s to %s\n",
rte_logs.dynamic_types[type].name == NULL ?
"" : rte_logs.dynamic_types[type].name,
eal_log_level2str(current),
eal_log_level2str(level));
}
}
int
rte_log_set_level(uint32_t type, uint32_t level)
{
@ -143,7 +158,7 @@ rte_log_set_level(uint32_t type, uint32_t level)
if (level > RTE_LOG_MAX)
return -1;
rte_logs.dynamic_types[type].loglevel = level;
logtype_set_level(type, level);
return 0;
}
@ -166,7 +181,7 @@ rte_log_set_level_regexp(const char *regex, uint32_t level)
continue;
if (regexec(&r, rte_logs.dynamic_types[i].name, 0,
NULL, 0) == 0)
rte_logs.dynamic_types[i].loglevel = level;
logtype_set_level(i, level);
}
regfree(&r);
@ -227,7 +242,7 @@ rte_log_set_level_pattern(const char *pattern, uint32_t level)
continue;
if (fnmatch(pattern, rte_logs.dynamic_types[i].name, 0) == 0)
rte_logs.dynamic_types[i].loglevel = level;
logtype_set_level(i, level);
}
return 0;
@ -266,29 +281,11 @@ log_lookup(const char *name)
return -1;
}
/* register an extended log type, assuming table is large enough, and id
* is not yet registered.
*/
static int
log_register(const char *name, int id)
{
char *dup_name = strdup(name);
if (dup_name == NULL)
return -ENOMEM;
rte_logs.dynamic_types[id].name = dup_name;
rte_logs.dynamic_types[id].loglevel = RTE_LOG_INFO;
return id;
}
/* register an extended log type */
int
rte_log_register(const char *name)
log_register(const char *name, uint32_t level)
{
struct rte_log_dynamic_type *new_dynamic_types;
int id, ret;
int id;
id = log_lookup(name);
if (id >= 0)
@ -301,13 +298,24 @@ rte_log_register(const char *name)
return -ENOMEM;
rte_logs.dynamic_types = new_dynamic_types;
ret = log_register(name, rte_logs.dynamic_types_len);
if (ret < 0)
return ret;
id = rte_logs.dynamic_types_len;
memset(&rte_logs.dynamic_types[id], 0,
sizeof(rte_logs.dynamic_types[id]));
rte_logs.dynamic_types[id].name = strdup(name);
if (rte_logs.dynamic_types[id].name == NULL)
return -ENOMEM;
logtype_set_level(id, level);
rte_logs.dynamic_types_len++;
return ret;
return id;
}
/* register an extended log type */
int
rte_log_register(const char *name)
{
return log_register(name, RTE_LOG_INFO);
}
/* Register an extended log type and try to pick its level from EAL options */
@ -316,11 +324,6 @@ rte_log_register_type_and_pick_level(const char *name, uint32_t level_def)
{
struct rte_eal_opt_loglevel *opt_ll;
uint32_t level = level_def;
int type;
type = rte_log_register(name);
if (type < 0)
return type;
TAILQ_FOREACH(opt_ll, &opt_loglevel_list, next) {
if (opt_ll->level > RTE_LOG_MAX)
@ -335,9 +338,7 @@ rte_log_register_type_and_pick_level(const char *name, uint32_t level_def)
}
}
rte_logs.dynamic_types[type].loglevel = level;
return type;
return log_register(name, level);
}
struct logtype {
@ -390,9 +391,11 @@ RTE_INIT_PRIO(log_init, LOG)
return;
/* register legacy log types */
for (i = 0; i < RTE_DIM(logtype_strings); i++)
log_register(logtype_strings[i].logtype,
logtype_strings[i].log_id);
for (i = 0; i < RTE_DIM(logtype_strings); i++) {
rte_logs.dynamic_types[logtype_strings[i].log_id].name =
strdup(logtype_strings[i].logtype);
logtype_set_level(logtype_strings[i].log_id, RTE_LOG_INFO);
}
rte_logs.dynamic_types_len = RTE_LOGTYPE_FIRST_EXT_ID;
}