libbpf: Configure log verbosity with env variable

Configure logging verbosity by setting LIBBPF_LOG_LEVEL environment
variable, which is applied only to default logger. Once user set their
custom logging callback, it is up to them to handle filtering.

Signed-off-by: Mykyta Yatsenko <yatsenko@meta.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20240524131840.114289-1-yatsenko@meta.com
This commit is contained in:
Mykyta Yatsenko
2024-05-24 14:18:40 +01:00
committed by Andrii Nakryiko
parent 0babfb126a
commit d4d3e68e8d
3 changed files with 36 additions and 2 deletions

View File

@@ -219,6 +219,14 @@ compilation and skeleton generation. Using Libbpf-rs will make building user
space part of the BPF application easier. Note that the BPF program themselves space part of the BPF application easier. Note that the BPF program themselves
must still be written in plain C. must still be written in plain C.
libbpf logging
==============
By default, libbpf logs informational and warning messages to stderr. The
verbosity of these messages can be controlled by setting the environment
variable LIBBPF_LOG_LEVEL to either warn, info, or debug. A custom log
callback can be set using ``libbpf_set_print()``.
Additional Documentation Additional Documentation
======================== ========================

View File

@@ -229,7 +229,30 @@ static const char * const prog_type_name[] = {
static int __base_pr(enum libbpf_print_level level, const char *format, static int __base_pr(enum libbpf_print_level level, const char *format,
va_list args) va_list args)
{ {
if (level == LIBBPF_DEBUG) const char *env_var = "LIBBPF_LOG_LEVEL";
static enum libbpf_print_level min_level = LIBBPF_INFO;
static bool initialized;
if (!initialized) {
char *verbosity;
initialized = true;
verbosity = getenv(env_var);
if (verbosity) {
if (strcasecmp(verbosity, "warn") == 0)
min_level = LIBBPF_WARN;
else if (strcasecmp(verbosity, "debug") == 0)
min_level = LIBBPF_DEBUG;
else if (strcasecmp(verbosity, "info") == 0)
min_level = LIBBPF_INFO;
else
fprintf(stderr, "libbpf: unrecognized '%s' envvar value: '%s', should be one of 'warn', 'debug', or 'info'.\n",
env_var, verbosity);
}
}
/* if too verbose, skip logging */
if (level > min_level)
return 0; return 0;
return vfprintf(stderr, format, args); return vfprintf(stderr, format, args);

View File

@@ -98,7 +98,10 @@ typedef int (*libbpf_print_fn_t)(enum libbpf_print_level level,
/** /**
* @brief **libbpf_set_print()** sets user-provided log callback function to * @brief **libbpf_set_print()** sets user-provided log callback function to
* be used for libbpf warnings and informational messages. * be used for libbpf warnings and informational messages. If the user callback
* is not set, messages are logged to stderr by default. The verbosity of these
* messages can be controlled by setting the environment variable
* LIBBPF_LOG_LEVEL to either warn, info, or debug.
* @param fn The log print function. If NULL, libbpf won't print anything. * @param fn The log print function. If NULL, libbpf won't print anything.
* @return Pointer to old print function. * @return Pointer to old print function.
* *