aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2024-04-24 05:17:00 +0300
committerFrederick Muriuki Muriithi2024-04-24 05:17:00 +0300
commitb317cd7e3684bf7c034ad0a1bb208d55fb87b164 (patch)
tree1f57f52bfa9d8eefeb7dd26b53dd812972f441e9
parentb4278a0dfd1aaa1c95cc811aa15f3cf9ea4a54bc (diff)
downloadgn-auth-b317cd7e3684bf7c034ad0a1bb208d55fb87b164.tar.gz
Setup logging: Use gunicorn's loggers where appropriate
If the application is run under GUnicorn, then use the gunicorn loggers otherwise, use some default development loggers. This can be extended to support other WSGI servers down the line if ever necessary.
-rw-r--r--gn_auth/__init__.py18
-rw-r--r--scripts/gn_auth_wsgi.py (renamed from main.py)37
-rw-r--r--wsgi.py7
3 files changed, 41 insertions, 21 deletions
diff --git a/gn_auth/__init__.py b/gn_auth/__init__.py
index 881ae1e..895f593 100644
--- a/gn_auth/__init__.py
+++ b/gn_auth/__init__.py
@@ -1,9 +1,8 @@
"""Application initialisation module."""
import os
import sys
-import logging
from pathlib import Path
-from typing import Optional
+from typing import Optional, Callable
from flask import Flask
from flask_cors import CORS
@@ -38,14 +37,6 @@ def override_settings_with_envvars(
for setting in (key for key in app.config if key not in ignore):
app.config[setting] = os.environ.get(setting) or app.config[setting]
-def setup_logging_handlers(app: Flask) -> None:
- """Setup the loggging handlers."""
- stderr_handler = logging.StreamHandler(stream=sys.stderr)
- app.logger.addHandler(stderr_handler)
-
- root_logger = logging.getLogger()
- root_logger.addHandler(stderr_handler)
- root_logger.setLevel(app.config["LOGLEVEL"])
def load_secrets_conf(app: Flask) -> None:
"""Load the secrets file."""
@@ -78,7 +69,10 @@ def parse_ssl_keys(app):
app.config["SSL_PRIVATE_KEY"] = __parse_key__(
Path(app.config["SSL_PRIVATE_KEY"]))
-def create_app(config: Optional[dict] = None) -> Flask:
+def create_app(
+ config: Optional[dict] = None,
+ setup_logging: Callable[[Flask], None] = lambda appl: None
+) -> Flask:
"""Create and return a new flask application."""
app = Flask(__name__)
@@ -96,9 +90,9 @@ def create_app(config: Optional[dict] = None) -> Flask:
parse_ssl_keys(app)
# ====== END: Setup configuration ======
+ setup_logging(app)
check_mandatory_settings(app)
- setup_logging_handlers(app)
setup_oauth2_server(app)
CORS(
diff --git a/main.py b/scripts/gn_auth_wsgi.py
index ae4b4a1..1de0b56 100644
--- a/main.py
+++ b/scripts/gn_auth_wsgi.py
@@ -1,13 +1,16 @@
"""Main entry point for project"""
+import os
import sys
import uuid
import json
+import logging
from math import ceil
from pathlib import Path
+from typing import Callable
from datetime import datetime
-
import click
+from flask import Flask
from yoyo import get_backend, read_migrations
from gn_auth import migrations
@@ -22,7 +25,37 @@ from gn_auth.auth.authorisation.users.admin.models import make_sys_admin
from scripts import register_sys_admin as rsysadm# type: ignore[import]
from scripts import migrate_existing_data as med# type: ignore[import]
-app = create_app()
+
+def dev_loggers(appl: Flask) -> None:
+ """Setup the logging handlers."""
+ stderr_handler = logging.StreamHandler(stream=sys.stderr)
+ appl.logger.addHandler(stderr_handler)
+
+ root_logger = logging.getLogger()
+ root_logger.addHandler(stderr_handler)
+ root_logger.setLevel(appl.config["LOGLEVEL"])
+
+
+def gunicorn_loggers(appl: Flask) -> None:
+ """Use gunicorn logging handlers for the application."""
+ logger = logging.getLogger("gunicorn.error")
+ appl.logger.handlers = logger.handlers
+ appl.logger.setLevel(logger.level)
+
+
+def setup_loggers() -> Callable[[Flask], None]:
+ """
+ Setup the loggers according to the WSGI server used to run the application.
+ """
+ # https://datatracker.ietf.org/doc/html/draft-coar-cgi-v11-03#section-4.1.17
+ # https://wsgi.readthedocs.io/en/latest/proposals-2.0.html#making-some-keys-required
+ # https://peps.python.org/pep-3333/#id4
+ software, *_version_and_comments = os.environ.get(
+ "SERVER_SOFTWARE", "").split('/')
+ return gunicorn_loggers if bool(software) else dev_loggers
+
+# app = create_app()
+app = create_app(setup_logging=setup_loggers())
##### BEGIN: CLI Commands #####
diff --git a/wsgi.py b/wsgi.py
deleted file mode 100644
index c44cb8a..0000000
--- a/wsgi.py
+++ /dev/null
@@ -1,7 +0,0 @@
-"""WSGI application entry-point."""
-from gn_auth import create_app
-
-app = create_app()
-
-if __name__ == "__main__":
- app.run()