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