Skip to content

Commit ba24ee0

Browse files
[PRMP-178] Reporting ECS task isn't producing all logs (#781)
* [PRMT-609]- refactored csv_to_staging_metadata * [PRMT-609]- added space * [PRMT-609]- fixed spaces * [PRMT-609]- fixed spaces * [PRMT-609]- testing singleton * [PRMT-609]- fixed tests --------- Co-authored-by: Robert Gaskin <[email protected]>
1 parent 02af7da commit ba24ee0

File tree

4 files changed

+47
-21
lines changed

4 files changed

+47
-21
lines changed

lambdas/tests/unit/conftest.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from enum import Enum
77

88
import pytest
9+
from utils.audit_logging_setup import LoggingService
910
from botocore.exceptions import ClientError
1011
from models.document_reference import DocumentReference
1112
from models.pds_models import Patient, PatientDetails
@@ -366,3 +367,18 @@ def expect_not_to_raise(exception, message_when_fail=""):
366367
def mock_jwt_encode(mocker):
367368
decoded_token = {"selected_organisation": {"org_ods_code": "ODS123"}}
368369
yield mocker.patch("jwt.decode", return_value=decoded_token)
370+
371+
@pytest.fixture(autouse=True)
372+
def reset_logging_singletons():
373+
LoggingService._instances.clear()
374+
375+
@pytest.fixture(autouse=True)
376+
def attach_caplog_handler(caplog):
377+
for instance in LoggingService._instances.values():
378+
instance.logger.addHandler(caplog.handler)
379+
yield
380+
for instance in LoggingService._instances.values():
381+
try:
382+
instance.logger.removeHandler(caplog.handler)
383+
except Exception:
384+
pass

lambdas/tests/unit/handlers/test_manage_nrl_pointer_handler.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from models.sqs.nrl_sqs_message import NrlSqsMessage
66
from utils.exceptions import NrlApiException
77

8-
98
@pytest.fixture
109
def mock_service(mocker):
1110
mocked_class = mocker.patch("handlers.manage_nrl_pointer_handler.NrlApiService")
@@ -57,8 +56,7 @@ def test_failed_to_create_a_pointer(mock_service, context, set_env, caplog):
5756
mock_service.create_new_pointer.side_effect = NrlApiException("test exception")
5857
with pytest.raises(NrlApiException):
5958
lambda_handler(event, context)
60-
actual_log = caplog.records[-2].msg
61-
assert actual_log == expected_log
59+
assert any(expected_log in record.message for record in caplog.records)
6260
mock_service.create_new_pointer.assert_called_once()
6361

6462

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,50 @@
11
import logging
2-
2+
import sys
33
from utils.logging_formatter import LoggingFormatter
44

5+
56
class LoggingService:
6-
audit_logger = None
7+
_instances = {}
8+
9+
def __new__(cls, name, *args, **kwargs):
10+
if name not in cls._instances:
11+
instance = super().__new__(cls)
12+
cls._instances[name] = instance
13+
return cls._instances[name]
714

815
def __init__(self, name):
16+
if getattr(self, '_initialized', False):
17+
return
18+
919
self.name = name
1020
self.logger = logging.getLogger(name)
1121
self.logger.setLevel(logging.INFO)
12-
self.formatter = LoggingFormatter()
13-
logging.Formatter.format = self.formatter.format
22+
23+
if not self.logger.handlers:
24+
handler = logging.StreamHandler(sys.stdout)
25+
handler.setFormatter(LoggingFormatter())
26+
self.logger.addHandler(handler)
27+
28+
self.logger.propagate = False
29+
30+
self._initialized = True
1431

1532
def info(self, message, custom_args: dict = None, *args, **kwargs):
16-
self.logger.info(message, extra={"custom_args": custom_args}, *args, **kwargs)
33+
self.logger.info(message, extra={"custom_args": custom_args or {}}, *args, **kwargs)
1734

1835
def error(self, message, custom_args: dict = None, *args, **kwargs):
19-
self.logger.error(message, extra={"custom_args": custom_args}, *args, **kwargs)
36+
self.logger.error(message, extra={"custom_args": custom_args or {}}, *args, **kwargs)
2037

2138
def warning(self, message, custom_args: dict = None, *args, **kwargs):
22-
self.logger.warning(
23-
message, extra={"custom_args": custom_args}, *args, **kwargs
24-
)
39+
self.logger.warning(message, extra={"custom_args": custom_args or {}}, *args, **kwargs)
2540

2641
def debug(self, message, custom_args: dict = None, *args, **kwargs):
27-
self.logger.debug(message, extra={"custom_args": custom_args}, *args, **kwargs)
42+
self.logger.debug(message, extra={"custom_args": custom_args or {}}, *args, **kwargs)
2843

29-
def exception(
30-
self, message, custom_args: dict = None, *args, exc_info=True, **kwargs
31-
):
44+
def exception(self, message, custom_args: dict = None, *args, exc_info=True, **kwargs):
3245
self.logger.exception(
33-
message, exc_info, extra={"custom_args": custom_args}, *args, **kwargs
46+
message, exc_info=exc_info, extra={"custom_args": custom_args or {}}, *args, **kwargs
3447
)
3548

3649
def critical(self, message, custom_args: dict = None, *args, **kwargs):
37-
self.logger.critical(
38-
message, extra={"custom_args": custom_args}, *args, **kwargs
39-
)
50+
self.logger.critical(message, extra={"custom_args": custom_args or {}}, *args, **kwargs)

lambdas/utils/logging_formatter.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
from utils.request_context import request_context
55

6+
67
class LoggingFormatter(logging.Formatter):
78
"""
89
A JSON formatter that automatically adds key information from the
@@ -29,4 +30,4 @@ def format(self, record: logging.LogRecord) -> str:
2930
if record.__dict__.get("custom_args", {}) is not None:
3031
log_content.update(record.__dict__.get("custom_args", {}))
3132

32-
return json.dumps(log_content)
33+
return json.dumps(log_content)

0 commit comments

Comments
 (0)