diff --git a/docs/settings.rst b/docs/settings.rst index 050b204..d16e855 100644 --- a/docs/settings.rst +++ b/docs/settings.rst @@ -48,6 +48,32 @@ A typical ``settings.toml`` file looks like this:: -----END PUBLIC KEY-----''' +Logging +------- + +Logging can be deeply customized via the configuration file as it uses +`dictConfig +`_ +from the `logging` section, by default it is similar to:: + + [logging] + version = 1 + disable_existing_loggers = false + + [logging.formatters.full] + format = "[%(asctime)s] %(levelname)s:%(name)s:%(message)s" + + [logging.handlers.stderr] + class = "logging.StreamHandler" + stream = "ext://sys.stderr" + level = "DEBUG" + formatter = "full" + + [logging.loggers.kisee] + level = "DEBUG" + handlers = ["stderr"] + + Sentry ------ diff --git a/kisee/kisee.py b/kisee/kisee.py index 64ff2b5..ea8ba7b 100644 --- a/kisee/kisee.py +++ b/kisee/kisee.py @@ -2,7 +2,7 @@ """ import argparse -import logging +import logging.config import os import sys from typing import Any, Mapping, Optional @@ -36,19 +36,33 @@ logger = logging.getLogger(__name__) - -def setup_logging(loglevel): # pragma: no cover +DEFAULT_LOGGING_CONFIG = { + "version": 1, + "disable_existing_loggers": False, + "formatters": { + "full": { + "format": "[%(asctime)s] %(levelname)s:%(name)s:%(message)s", + } + }, + "handlers": { + "stderr": { + "class": "logging.StreamHandler", + "stream": "ext://sys.stderr", + "level": "DEBUG", + "formatter": "full", + } + }, + "loggers": {"kisee": {"level": "DEBUG", "handlers": ["stderr"]}}, +} + + +def setup_logging(settings: dict): # pragma: no cover """Setup basic logging Args: loglevel (int): minimum loglevel for emitting messages """ - logformat = "[%(asctime)s] %(levelname)s:%(name)s:%(message)s" - logging.basicConfig( - level=50 - (loglevel * 10), - stream=sys.stdout, - format=logformat, - datefmt="%Y-%m-%d %H:%M:%S", - ) + conf = settings["logging"] if "logging" in settings else DEFAULT_LOGGING_CONFIG + logging.config.dictConfig(conf) logger.info("Kisee %s starting!", kisee.__version__) @@ -77,14 +91,6 @@ def parse_args(program_args=None) -> argparse.Namespace: program_args = sys.argv[1:] parser = argparse.ArgumentParser(description="Shape Identity Provider") parser.add_argument("--settings", default="settings.toml") - parser.add_argument( - "-v", - "--verbose", - dest="loglevel", - default=0, - help="Verbose mode (-vv for more, -vvv, …)", - action="count", - ) return parser.parse_args(program_args) @@ -146,8 +152,8 @@ async def on_cleanup_wrapper(app): def main() -> None: # pragma: no cover """Command line entry point.""" args = parse_args() - setup_logging(args.loglevel) settings = load_conf(args.settings) + setup_logging(settings) if sentry_sdk: sentry_sdk.init( # pylint: disable=abstract-class-instantiated # see https://github.com/getsentry/sentry-python/issues/1081