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 4b3529edbb
commit eb4e772627
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
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
========================

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,
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 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
* 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.
* @return Pointer to old print function.
*