"""Provides common configuration for loggers verbosity."""
import argparse
from collections.abc import Mapping
from typing import Any
from gain import logging
[docs]
class VerbosityConfiguration:
"""Defines common configuration of verbosity for loggers."""
[docs]
@staticmethod
def set_arguments(parser: argparse.ArgumentParser) -> None:
"""Add verbosity arguments to argument parser."""
parser.add_argument("--verbose", "-v", "-V", action="count", default=0)
parser.add_argument(
"--logfile", type=str, default=None,
help="File to log output to. If not set, logs to console.",
)
[docs]
@staticmethod
def set(args: argparse.Namespace | Mapping[str, Any]) -> None:
"""Read verbosity settings from parsed arguments and sets logger."""
if isinstance(args, argparse.Namespace):
args = vars(args)
verbosity = int(args.get("verbose", 0))
loglevel = VerbosityConfiguration.verbosity(verbosity)
# basicConfig only adds a handler, and ignores ``level`` once the
# root has one; ``force=True`` would close handlers other code
# owns. Set the level directly, and only ever more verbose.
logging.basicConfig(filename=args["logfile"], encoding="utf-8")
root = logging.getLogger()
root.setLevel(min(root.level, loglevel))
VerbosityConfiguration.adjust_verbosity(loglevel)
[docs]
@staticmethod
def verbosity(verbosity: int) -> int:
"""Get verbosity level from loglevel."""
if verbosity == 1:
loglevel = logging.INFO
elif verbosity == 2:
loglevel = logging.DEBUG
elif verbosity >= 3:
loglevel = logging.TRACE
else:
loglevel = logging.WARNING
return loglevel
[docs]
@staticmethod
def adjust_verbosity(loglevel: int) -> None:
"""Keep the chatty third-party loggers no louder than the CLI."""
logging.getLogger("impala").setLevel(logging.WARNING)
logging.getLogger("distributed").setLevel(logging.WARNING)
logging.getLogger("bokeh").setLevel(logging.ERROR)
logging.getLogger("fsspec").setLevel(max(loglevel, logging.INFO))
logging.getLogger("matplotlib").setLevel(max(loglevel, logging.INFO))
logging.getLogger("botocore").setLevel(max(loglevel, logging.INFO))
logging.getLogger("s3fs").setLevel(max(loglevel, logging.INFO))