diff --git a/aikido_firewall/__init__.py b/aikido_firewall/__init__.py index 1dfe0b327..49b19264b 100644 --- a/aikido_firewall/__init__.py +++ b/aikido_firewall/__init__.py @@ -2,9 +2,19 @@ Aggregates from the different modules """ +from dotenv import load_dotenv + # Import sources import aikido_firewall.sources.django import aikido_firewall.sources.flask # Import middleware import aikido_firewall.middleware.django + +# Import logger +from aikido_firewall.helpers.logging import logger + +# Load environment variables +load_dotenv() + +logger.info("Aikido python firewall started") diff --git a/aikido_firewall/helpers/__init__.py b/aikido_firewall/helpers/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/aikido_firewall/helpers/logging.py b/aikido_firewall/helpers/logging.py new file mode 100644 index 000000000..1f7a47938 --- /dev/null +++ b/aikido_firewall/helpers/logging.py @@ -0,0 +1,32 @@ +""" +Logging helper, this will create and set logging +""" + +import logging +import sys +import os + + +APPLICATION_NAME = "aikido_firewall" + +# Set log level +aikido_debug_env = os.getenv("AIKIDO_DEBUG") +LOG_LEVEL = logging.INFO +if aikido_debug_env is not None: + debug = aikido_debug_env.lower() in ["true", "1"] + LOG_LEVEL = logging.DEBUG if debug else logging.INFO + +# Create a logger +logger = logging.getLogger(APPLICATION_NAME) + +# Configure format +fmt = logging.Formatter("%(name)s: %(asctime)s | %(levelname)s > %(message)s") +# Get stdout handler +stdout = logging.StreamHandler(stream=sys.stdout) +stdout.setLevel(LOG_LEVEL) +stdout.setFormatter(fmt) +logger.addHandler(stdout) + +# Configure logger +logger.setLevel(LOG_LEVEL) +logger.debug("Created logger") diff --git a/aikido_firewall/middleware/django.py b/aikido_firewall/middleware/django.py index d855848aa..c5fe8bf2b 100644 --- a/aikido_firewall/middleware/django.py +++ b/aikido_firewall/middleware/django.py @@ -3,7 +3,7 @@ uses headers, body, etc. as sources """ -import logging +from aikido_firewall.helpers.logging import logger class AikidoMiddleware: @@ -15,17 +15,17 @@ def __init__(self, get_response): self.get_response = get_response def __call__(self, request, *args, **kwargs): - logging.critical("[AIK] Aikido middleware : call") + logger.debug("Aikido middleware for `django` was called : __call__") return self.get_response(request) def process_exception(self, request, exception): """ Do something when an exception occurs whilst django is processing a request """ - logging.critical("[AIK] Aikido middleware : exception") + logger.debug("Aikido middleware for `django` was called : process_exception") def process_request(self, request): """ executed during the request phase of the Django request-response cycle. """ - logging.critical("[AIK] Aikido middleware : request") + logger.debug("Aikido middleware for `django` was called : process_request") diff --git a/aikido_firewall/sources/django.py b/aikido_firewall/sources/django.py index e6d89ad1c..f68d2a2b8 100644 --- a/aikido_firewall/sources/django.py +++ b/aikido_firewall/sources/django.py @@ -3,6 +3,8 @@ """ import importhook +from aikido_firewall.helpers.logging import logger + AIKIDO_MIDDLEWARE_ADDR = "aikido_firewall.middleware.django.AikidoMiddleware" @@ -19,5 +21,5 @@ def on_django_import(django): # pylint: disable=no-member setattr(modified_django.settings, "MIDDLEWARE", new_middleware_array) - print("[AIK] Modified Django") + logger.debug("Wrapped `django` module") return modified_django diff --git a/aikido_firewall/sources/flask.py b/aikido_firewall/sources/flask.py index 0fa2b7d67..5507fa1ad 100644 --- a/aikido_firewall/sources/flask.py +++ b/aikido_firewall/sources/flask.py @@ -4,8 +4,8 @@ import copy from importlib.metadata import version -import logging import importhook +from aikido_firewall.helpers.logging import logger class AikidoMiddleware: # pylint: disable=too-few-public-methods @@ -17,7 +17,7 @@ def __init__(self, app): self.app = app def __call__(self, environ, start_response): - logging.critical("[AIK] Aikido middleware is working") + logger.debug("Aikido middleware for `flask` was called") response = self.app(environ, start_response) return response @@ -35,11 +35,10 @@ def on_flask_import(flask): def aikido_flask_init(_self, *args, **kwargs): prev_flask_init(_self, *args, **kwargs) - print("[AIK] Flask version : ", version("flask")) + logger.debug("Wrapper - `flask` version : %s", version("flask")) _self.wsgi_app = AikidoMiddleware(_self.wsgi_app) - print(_self) # pylint: disable=no-member setattr(modified_flask.Flask, "__init__", aikido_flask_init) - print("[AIK] Modified flask") + logger.debug("Wrapped `flask` module") return modified_flask diff --git a/docs/logging.md b/docs/logging.md new file mode 100644 index 000000000..d3f016901 --- /dev/null +++ b/docs/logging.md @@ -0,0 +1,6 @@ +# Logging +Aikido by default uses the `INFO` logging level, if you want debug messages from aikido, +Set the `AIKIDO_DEBUG` environment variable. Like so : +```env +AIKIDO_DEBUG=True +``` diff --git a/poetry.lock b/poetry.lock index 4cefad54a..9d59105a8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -204,6 +204,20 @@ tomlkit = ">=0.10.1" spelling = ["pyenchant (>=3.2,<4.0)"] testutils = ["gitpython (>3)"] +[[package]] +name = "python-dotenv" +version = "1.0.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + [[package]] name = "tomlkit" version = "0.13.0" @@ -218,4 +232,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.12" -content-hash = "9eb7e93a0a3575f48f3e4590a1cd7f0b25608fc0e0b632d36e012a2742e95c10" +content-hash = "40aa90d1427e491a0cef152180c3fe8139d360d8caab01610185754c11fd65a5" diff --git a/pyproject.toml b/pyproject.toml index 88739bb6b..df407dbab 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,6 +8,7 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.12" importhook = "^1.0.9" +python-dotenv = "^1.0.1" [tool.poetry.group.dev.dependencies] black = "^24.4.2"