From 35303b98c0633a745a7b89e2c68f48e0e12f58ea Mon Sep 17 00:00:00 2001 From: Marijn Kampf <marijn.kampf@digital.trade.gov.uk> Date: Mon, 22 Apr 2024 12:41:22 +0100 Subject: [PATCH 1/3] Use ASIM formatter for logger on production environments --- Dockerfile | 2 +- app/settings/common.py | 47 +++++++++++++++++++++++------------------ app/settings/e2etest.py | 33 +++++++++++++++++++++++++++++ pytest.ini | 1 + requirements.txt | 1 + 5 files changed, 63 insertions(+), 21 deletions(-) diff --git a/Dockerfile b/Dockerfile index 64b30da4..dad4f0fc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.8 +FROM python:3.12 RUN mkdir /usr/src/app WORKDIR /usr/src/app diff --git a/app/settings/common.py b/app/settings/common.py index 68f35388..314bbec1 100644 --- a/app/settings/common.py +++ b/app/settings/common.py @@ -12,6 +12,7 @@ import logging.config import os +import sys from urllib.parse import urlencode import environ @@ -19,43 +20,49 @@ from django.core.exceptions import ImproperlyConfigured from django.urls import reverse_lazy from django.utils import timezone +from django_log_formatter_asim import ASIMFormatter from sentry_sdk.integrations.celery import CeleryIntegration from sentry_sdk.integrations.django import DjangoIntegration environ.Env.read_env() # read the .env file which should be in the same folder as settings.py env = environ.Env() -logging.config.dictConfig({ +# Logging +LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { - 'console': { - 'format': '[%(asctime)s] [%(levelname)-4s] %(name)-8s: %(message)s', - 'datefmt': '%d-%m-%Y %H:%M:%S' + 'verbose': { + 'format': '%(asctime)s [%(levelname)s] [%(name)s] %(message)s' + }, + 'asim_formatter': { + '()': ASIMFormatter, }, - 'file': { - 'format': '%(asctime)s %(name)-12s %(levelname)-8s %(message)s' - } }, 'handlers': { - 'console': { + 'asim': { 'class': 'logging.StreamHandler', - 'formatter': 'console' + 'formatter': 'asim_formatter', + 'stream': sys.stdout, }, - 'file': { - 'level': 'DEBUG' if env.bool('DEBUG') else 'INFO', - 'class': 'logging.FileHandler', - 'formatter': 'file', - 'filename': '/tmp/debug.log' - } + }, + 'root': { + 'level': 'INFO', + 'handlers': ['asim'], }, 'loggers': { - '': { + 'django': { 'level': 'INFO', - 'handlers': ['console', 'file'] - } - } -}) + 'handlers': ['asim'], + 'propagate': False, + }, + 'django.db.backends': { + 'level': 'ERROR', + 'handlers': ['asim'], + 'propagate': False, + }, + }, +} # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) diff --git a/app/settings/e2etest.py b/app/settings/e2etest.py index 32b66d38..f4999237 100644 --- a/app/settings/e2etest.py +++ b/app/settings/e2etest.py @@ -1,3 +1,36 @@ from app.settings.common import * ROOT_URLCONF = 'app.testfixtureapi_urls' + +# For local/E2E tests use "plain" logging (read non ASIM formatted) +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'formatters': { + 'console': { + 'format': '[%(asctime)s] [%(levelname)-4s] %(name)-8s: %(message)s', + 'datefmt': '%d-%m-%Y %H:%M:%S' + }, + 'file': { + 'format': '%(asctime)s %(name)-12s %(levelname)-8s %(message)s' + } + }, + 'handlers': { + 'console': { + 'class': 'logging.StreamHandler', + 'formatter': 'console' + }, + 'file': { + 'level': 'DEBUG' if env.bool('DEBUG') else 'INFO', + 'class': 'logging.FileHandler', + 'formatter': 'file', + 'filename': '/tmp/debug.log' + } + }, + 'loggers': { + '': { + 'level': 'INFO', + 'handlers': ['console', 'file'] + } + } +} \ No newline at end of file diff --git a/pytest.ini b/pytest.ini index 63cf9959..96f6a032 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,3 +1,4 @@ [pytest] DJANGO_SETTINGS_MODULE = app.settings.djangotest python_files = tests.py test_*.py +# pythonpath = . tests app app/pingdom/tests pingdom diff --git a/requirements.txt b/requirements.txt index cfdf5070..97683556 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,6 +17,7 @@ django-cache-memoize==0.2.0 django-environ==0.11.2 django-extensions==3.2.3 django-filter==24.2 +django-log-formatter-asim==0.0.4 django-redis==5.4.0 django-rest-knox==4.2.0 django-staff-sso-client==4.2.2 From b600963743945b452907eaadaa7753c6710f573a Mon Sep 17 00:00:00 2001 From: Marijn Kampf <marijn.kampf@digital.trade.gov.uk> Date: Mon, 22 Apr 2024 12:53:08 +0100 Subject: [PATCH 2/3] Upgrade Python version --- .circleci/config.yml | 2 +- doc/source/conf.py | 2 +- runtime.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 62158957..db2076b3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -42,7 +42,7 @@ jobs: path: cypress/screenshots docs-build: docker: - - image: python:3.8 + - image: python:3.12 steps: - checkout - dotenv/source: diff --git a/doc/source/conf.py b/doc/source/conf.py index c3202fcd..a49507e6 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -90,7 +90,7 @@ re.MULTILINE | re.DOTALL).group(1) intersphinx_mapping = { - "python": ("https://docs.python.org/3.8", None), + "python": ("https://docs.python.org/3.12", None), "django": ( "https://docs.djangoproject.com/en/dev/", "https://docs.djangoproject.com/en/dev/_objects/", diff --git a/runtime.txt b/runtime.txt index cdd524d7..44f8fbe3 100644 --- a/runtime.txt +++ b/runtime.txt @@ -1 +1 @@ -python-3.8.18 +python-3.12.0 From a7683263b899242bb6d156d1759c68ef1d4cbef2 Mon Sep 17 00:00:00 2001 From: Marijn Kampf <marijn.kampf@digital.trade.gov.uk> Date: Tue, 23 Apr 2024 10:47:57 +0100 Subject: [PATCH 3/3] Revert pytest.ini Remove comment --- pytest.ini | 1 - 1 file changed, 1 deletion(-) diff --git a/pytest.ini b/pytest.ini index 96f6a032..63cf9959 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,4 +1,3 @@ [pytest] DJANGO_SETTINGS_MODULE = app.settings.djangotest python_files = tests.py test_*.py -# pythonpath = . tests app app/pingdom/tests pingdom