On Fri, May 24, 2024 at 6:21 AM Mykyta Yatsenko <mykyta.yatsenko5@xxxxxxxxx> wrote: > > From: Mykyta Yatsenko <yatsenko@xxxxxxxx> > > 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@xxxxxxxx> > --- > Documentation/bpf/libbpf/libbpf_overview.rst | 7 ++++++ > tools/lib/bpf/libbpf.c | 24 +++++++++++++++++++- > tools/lib/bpf/libbpf.h | 5 +++- > 3 files changed, 34 insertions(+), 2 deletions(-) > I did a few tweaks, mentioned below, and applied to bpf-next. Thanks! > diff --git a/Documentation/bpf/libbpf/libbpf_overview.rst b/Documentation/bpf/libbpf/libbpf_overview.rst > index f36a2d4ffea2..982dfd71a13d 100644 > --- a/Documentation/bpf/libbpf/libbpf_overview.rst > +++ b/Documentation/bpf/libbpf/libbpf_overview.rst > @@ -219,6 +219,13 @@ 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()``. > + reformatted this to use line length consistent with the rest of the document > Additional Documentation > ======================== > > diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c > index 5401f2df463d..d0465ca74afc 100644 > --- a/tools/lib/bpf/libbpf.c > +++ b/tools/lib/bpf/libbpf.c > @@ -229,7 +229,29 @@ 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) > + static enum libbpf_print_level min_level = LIBBPF_INFO; > + static const char *env_var = "LIBBPF_LOG_LEVEL"; no need for this to be static > + 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, "Unexpected value of %s env variable\n", env_var); I've added "libbpf: " prefix and expanded the message with supported values. > + } > + } > + > + /* if too verbose, skip logging */ > + if (level > min_level) > return 0; > > return vfprintf(stderr, format, args); > diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h > index c3f77d9260fe..26e4e35528c5 100644 > --- a/tools/lib/bpf/libbpf.h > +++ b/tools/lib/bpf/libbpf.h > @@ -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. > * > -- > 2.45.0 >