From dcf855a443fd36a2e82c0222fa96bc63574bce86 Mon Sep 17 00:00:00 2001 From: Elia Bieri Date: Wed, 28 Jun 2023 17:17:05 +0200 Subject: [PATCH] Cherrypick logging configuration from VBV-326 --- server/config/settings/base.py | 27 +++++++++++++++++++ .../vbv_lernwelt/core/middleware/graphene.py | 16 +++++++++++ 2 files changed, 43 insertions(+) create mode 100644 server/vbv_lernwelt/core/middleware/graphene.py diff --git a/server/config/settings/base.py b/server/config/settings/base.py index 61c931e6..41a1a8fa 100644 --- a/server/config/settings/base.py +++ b/server/config/settings/base.py @@ -328,6 +328,9 @@ if DEBUG: IT_DJANGO_LOGGING_CONF = env("IT_DJANGO_LOGGING_CONF", default=logging_conf_default) if IT_DJANGO_LOGGING_CONF == "IT_DJANGO_LOGGING_CONF_CONSOLE_COLOR": + IT_LOCAL_HIDE_DJANGO_SERVER_LOGS = env.bool( + "IT_LOCAL_HIDE_DJANGO_SERVER_LOGS", True + ) timestamper = structlog.processors.TimeStamper(fmt="%Y-%m-%d %H:%M:%S") LOGGING = { "version": 1, @@ -347,6 +350,9 @@ if IT_DJANGO_LOGGING_CONF == "IT_DJANGO_LOGGING_CONF_CONSOLE_COLOR": "class": "logging.StreamHandler", "formatter": "colored", }, + "null": { + "class": "logging.NullHandler", + }, }, "loggers": { "": { @@ -354,11 +360,29 @@ if IT_DJANGO_LOGGING_CONF == "IT_DJANGO_LOGGING_CONF_CONSOLE_COLOR": "level": "INFO", "propagate": True, }, + "django": { + "handlers": ["default"], + "level": "INFO", + "propagate": False, + }, + "django.server": { + "handlers": ["null"] + if IT_LOCAL_HIDE_DJANGO_SERVER_LOGS + else ["default"], + "level": "INFO", + "propagate": False, + }, "vbv_lernwelt": { "handlers": ["default"], "level": "DEBUG", "propagate": False, }, + "vbv_lernwelt.core.middleware.security": { + "handlers": ["default"], + # Security logs are mainly meant for production + "level": "WARN" if IT_LOCAL_HIDE_DJANGO_SERVER_LOGS else "DEBUG", + "propagate": False, + }, }, } @@ -573,6 +597,9 @@ OAUTH = { GRAPHENE = { "SCHEMA": "vbv_lernwelt.core.schema.schema", "SCHEMA_OUTPUT": "../client/src/gql/schema.graphql", + "MIDDLEWARE": [ + "vbv_lernwelt.core.middleware.graphene.GrapheneErrorLoggingMiddleware", + ], } # GRAPPLE = { # "EXPOSE_GRAPHIQL": DEBUG, diff --git a/server/vbv_lernwelt/core/middleware/graphene.py b/server/vbv_lernwelt/core/middleware/graphene.py new file mode 100644 index 00000000..4128d252 --- /dev/null +++ b/server/vbv_lernwelt/core/middleware/graphene.py @@ -0,0 +1,16 @@ +import traceback + +import structlog +from graphene import ResolveInfo + +logger = structlog.get_logger(__name__) + + +class GrapheneErrorLoggingMiddleware(object): + # https://jerrynsh.com/how-to-monitor-python-graphql-api-with-sentry/ + def resolve(self, next, root, info: ResolveInfo, **args): + try: + return next(root, info, **args) + except Exception as error: + logger.error(traceback.format_exc()) + raise error