#include "eal_options.h"
#include "eal_filesystem.h"
#include "eal_private.h"
+#include "eal_log.h"
#ifndef RTE_EXEC_ENV_WINDOWS
#include "eal_trace.h"
#endif
}
#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;
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)
+ for (i = 1; i <= RTE_LOG_MAX; i++) {
+ if (strncmp(eal_log_level2str(i), level, len) == 0)
return i;
}
char *str, *level;
int priority;
+ if (strcmp(arg, "help") == 0) {
+ eal_log_usage();
+ exit(EXIT_SUCCESS);
+ }
+
str = strdup(arg);
if (str == NULL)
return -1;
}
priority = eal_parse_log_priority(level);
- if (priority < 0) {
- fprintf(stderr, "invalid log priority: %s\n", level);
+ if (priority <= 0) {
+ fprintf(stderr, "Invalid log level: %s\n", level);
goto fail;
}
+ if (priority > (int)RTE_LOG_MAX) {
+ fprintf(stderr, "Log level %d higher than maximum (%d)\n",
+ priority, RTE_LOG_MAX);
+ priority = RTE_LOG_MAX;
+ }
if (regex) {
if (rte_log_set_level_regexp(regex, priority) < 0) {
regex, priority);
goto fail;
}
- if (rte_log_save_regexp(regex, priority) < 0)
+ if (eal_log_save_regexp(regex, priority) < 0)
goto fail;
} else if (pattern) {
if (rte_log_set_level_pattern(pattern, priority) < 0) {
pattern, priority);
goto fail;
}
- if (rte_log_save_pattern(pattern, priority) < 0)
+ if (eal_log_save_pattern(pattern, priority) < 0)
goto fail;
} else {
rte_log_set_global_level(priority);
RTE_LOG(ERR, EAL, "Invalid length of --" OPT_MBUF_POOL_OPS_NAME" option\n");
return -1;
}
- if (index(eal_get_hugefile_prefix(), '%') != NULL) {
+ if (strchr(eal_get_hugefile_prefix(), '%') != NULL) {
RTE_LOG(ERR, EAL, "Invalid char, '%%', in --"OPT_FILE_PREFIX" "
"option\n");
return -1;
#ifndef RTE_EXEC_ENV_WINDOWS
" --"OPT_SYSLOG" Set syslog facility\n"
#endif
- " --"OPT_LOG_LEVEL"=<int> Set global log level\n"
- " --"OPT_LOG_LEVEL"=<type-match>:<int>\n"
+ " --"OPT_LOG_LEVEL"=<level> Set global log level\n"
+ " --"OPT_LOG_LEVEL"=<type-match>:<level>\n"
" Set specific log level\n"
+ " --"OPT_LOG_LEVEL"=help Show log types and levels\n"
#ifndef RTE_EXEC_ENV_WINDOWS
" --"OPT_TRACE"=<regex-match>\n"
" Enable trace based on regular expression trace name.\n"