diff --git a/CHANGELOG.md b/CHANGELOG.md index c23835a..d930515 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to ## Unreleased - add allowlist for URL paths to nginx ingress +- allow customizing log levels per logger ## [1.0.4] - 2024-09-11 - serve static files diff --git a/README.md b/README.md index ec1968a..4ac64a2 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,13 @@ number and date. 3. Commit and push to `main`. 4. Update the `production` tag and push it. +## Environment variables + +| variable | usage | +| --- | --- | +| `LOG_LEVEL` | Sets the log level for the root logger, i.e. the default. Defaults to `INFO`. | +| `LOG_LEVELS` | A JSON object that can be used to set log levels for specific loggers, e.g. `{"satosa.backends.saml2": "DEBUG"}`. Defaults to `{}`. | + ## Contributing This project is intended to be community-driven, so please, do not hesitate to diff --git a/docker/files/usr/local/etc/gunicorn/satosa.py b/docker/files/usr/local/etc/gunicorn/satosa.py index 41f3e5c..1e5fea5 100644 --- a/docker/files/usr/local/etc/gunicorn/satosa.py +++ b/docker/files/usr/local/etc/gunicorn/satosa.py @@ -1,4 +1,5 @@ import datetime +import json import logging import os import sys @@ -29,6 +30,8 @@ class RequestJSONFormatter(json_log_formatter.JSONFormatter): url += f"?{record.args['q']}" return { + "logger": record.name, + "level": record.levelname, "remote_ip": record.args["h"], "method": record.args["m"], "path": url, @@ -37,7 +40,7 @@ class RequestJSONFormatter(json_log_formatter.JSONFormatter): "user_agent": record.args["a"], "referer": record.args["f"], "duration_in_ms": record.args["M"], - "poppid": record.process, + "pid": record.process, } @@ -55,11 +58,23 @@ class DefaultJSONFormatter(json_log_formatter.JSONFormatter): payload: dict[str, str | int | float] = super().json_record( message, extra, record ) + payload["logger"] = record.name payload["level"] = record.levelname payload["pid"] = record.process return payload +class NoPingFilter(logging.Filter): + """ + Filters out /ping requests from the access log. + """ + + def filter(self, record: logging.LogRecord) -> bool: + return not( record.args.get("m", "") == "GET" + and record.args.get("U", "") == "/ping" + and str(record.args.get("s", "")) == "200" ) + + bind = ["0.0.0.0:8000"] name = "satosa" python_path = "/app" @@ -76,6 +91,9 @@ accesslog = "-" errorlog = "-" loglevel = os.environ.get("LOG_LEVEL", "INFO") +loglevels_json = os.environ.get("LOG_LEVELS", "{}") +loglevels = json.loads(loglevels_json) + logconfig_dict = { "version": 1, "disable_existing_loggers": True, @@ -95,7 +113,24 @@ logconfig_dict = { "handlers": ["json_request"], "propagate": False, "qualname": "gunicorn.access", + "filters": [NoPingFilter()], }, + "satosa.base": { + "level": "INFO", + }, + "satosa.state": { + "level": "INFO", + }, + "satosa.proxy_server": { + "level": "INFO", + }, + "satosa.routing": { + "level": "INFO", + }, + "satosa.frontends.ping": { + "level": "INFO", + }, + **{k: {"level": v.upper()} for k, v in loglevels.items()}, }, "formatters": { "json_request": { diff --git a/src/helm/env.d/outscale-production/values.oidc2fer.yaml.gotmpl b/src/helm/env.d/outscale-production/values.oidc2fer.yaml.gotmpl index d069f83..15a6662 100644 --- a/src/helm/env.d/outscale-production/values.oidc2fer.yaml.gotmpl +++ b/src/helm/env.d/outscale-production/values.oidc2fer.yaml.gotmpl @@ -9,7 +9,8 @@ satosa: BASE_URL: https://renater.agentconnect.gouv.fr GUNICORN_CMD_ARGS: --workers=3 - LOG_LEVEL: info + LOG_LEVEL: INFO + LOG_LEVELS: '{ "satosa.backends.saml2": "DEBUG" }' SAML2_DISCOVERY_URL: https://discovery.renater.fr/agentconnect/ SAML2_METADATA_URL: https://pub.federation.renater.fr/metadata/renater/main/main-idps-renater-metadata.xml diff --git a/src/helm/env.d/staging/values.oidc2fer.yaml.gotmpl b/src/helm/env.d/staging/values.oidc2fer.yaml.gotmpl index 5706507..4b60cc3 100644 --- a/src/helm/env.d/staging/values.oidc2fer.yaml.gotmpl +++ b/src/helm/env.d/staging/values.oidc2fer.yaml.gotmpl @@ -9,7 +9,8 @@ satosa: BASE_URL: https://oidc2fer-staging.beta.numerique.gouv.fr GUNICORN_CMD_ARGS: --workers=3 - LOG_LEVEL: debug + LOG_LEVEL: DEBUG + LOG_LEVELS: '{ "satosa.backends.saml2": "DEBUG" }' SAML2_DISCOVERY_URL: https://discovery.renater.fr/test/ SAML2_METADATA_URL: https://pub.federation.renater.fr/metadata/test/preview/preview-idps-test-metadata.xml