1- from common .clients import logger
1+ import logging
2+ import json
3+ import ast
24from typing import Dict , Any
5+
6+ from common .clients import logger as clients_logger
37from pds_details import pds_get_patient_id , pds_get_patient_details
48from ieds_db_operations import (
59 ieds_update_patient_id ,
610 extract_patient_resource_from_item ,
711 get_items_from_patient_id ,
812)
913from utils import make_status
10- import json
11- import ast
14+
15+ # Module-local logger for records processing. Use this for logs local to this module
16+ # so they can be managed separately from the shared clients logger.
17+ module_logger = logging .getLogger (__name__ )
18+ # Keep a module-level `logger` symbol for backwards compatibility with tests
19+ # and other modules that patch or import `record_processor.logger`.
20+ logger = module_logger
1221
1322
1423def process_record (event_record : Dict [str , Any ]) -> Dict [str , Any ]:
1524
16- logger .info ("process_record. Processing record: %s" , event_record )
17- # Probe logger configuration to help debug missing logs in CloudWatch
25+ module_logger .info ("process_record. Processing record: %s" , event_record )
26+ # Probe logger configuration to help debug missing logs in CloudWatch.
27+ # Log both the module-local logger and the shared clients logger so it's
28+ # possible to compare their handlers/levels in CloudWatch.
1829 try :
19- logger .info (
20- "probe: logger id=%s module=%s level=%d handlers=%d" ,
21- hex (id (logger )), getattr (logger , "__module__" , None ),
22- logger .getEffectiveLevel (), len (logger .handlers ),
30+ module_logger .info (
31+ "probe: module_logger id=%s module=%s level=%d handlers=%d" ,
32+ hex (id (module_logger )), getattr (module_logger , "__module__" , None ),
33+ module_logger .getEffectiveLevel (), len (module_logger .handlers ),
34+ )
35+ module_logger .info (
36+ "probe: clients_logger id=%s module=%s level=%d handlers=%d" ,
37+ hex (id (clients_logger )), getattr (clients_logger , "__module__" , None ),
38+ clients_logger .getEffectiveLevel (), len (clients_logger .handlers ),
2339 )
2440 except Exception :
2541 # Keep probe non-fatal in production
@@ -34,18 +50,18 @@ def process_record(event_record: Dict[str, Any]) -> Dict[str, Any]:
3450 try :
3551 body = ast .literal_eval (body_text )
3652 except (ValueError , SyntaxError ):
37- logger .error ("Failed to parse body: %s" , body_text )
53+ module_logger .error ("Failed to parse body: %s" , body_text )
3854 return {"status" : "error" , "message" : "Invalid body format" }
3955 else :
4056 body = body_text
4157
4258 nhs_number = body .get ("subject" )
4359 # Reached
44- logger .info ("process record NHS number: %s" , nhs_number )
60+ module_logger .info ("process record NHS number: %s" , nhs_number )
4561 if nhs_number :
4662 return process_nhs_number (nhs_number )
4763
48- logger .info ("No NHS number found in event record" )
64+ module_logger .info ("No NHS number found in event record" )
4965 return {"status" : "error" , "message" : "No NHS number found in event record" }
5066
5167
@@ -59,20 +75,21 @@ def process_nhs_number(nhs_number: str) -> Dict[str, Any]:
5975 if new_nhs_number == nhs_number :
6076 return make_status ("No update required" , nhs_number )
6177
62- logger .info ("Update patient ID from %s to %s" , nhs_number , new_nhs_number )
78+ module_logger .info ("Update patient ID from %s to %s" , nhs_number , new_nhs_number )
6379
6480 try :
6581 # Fetch PDS Patient resource and IEDS resources for the old NHS number
6682 pds_patient_resource , ieds_resources = fetch_pds_and_ieds_resources (nhs_number )
6783 except Exception as e :
68- logger .exception ("process_nhs_number: failed to fetch demographic details: %s" , e )
84+ module_logger .exception ("process_nhs_number: failed to fetch demographic details: %s" , e )
6985 return make_status (str (e ), nhs_number , "error" )
7086
71- logger .info ("Fetched PDS details: %s" , pds_patient_resource )
72- logger .info ("Fetched IEDS resources. IEDS count: %d" , len (ieds_resources ), ieds_resources if ieds_resources else 0 )
87+ module_logger .info ("Fetched PDS details: %s" , pds_patient_resource )
88+ module_logger .info ("Fetched IEDS resources. IEDS count: %d" , len (ieds_resources ),
89+ ieds_resources if ieds_resources else 0 )
7390
7491 if not ieds_resources :
75- logger .info ("No IEDS records returned for NHS number: %s" , nhs_number )
92+ module_logger .info ("No IEDS records returned for NHS number: %s" , nhs_number )
7693 return make_status (f"No records returned for ID: { nhs_number } " , nhs_number )
7794
7895 # Compare demographics from PDS to each IEDS item, keep only matching records
@@ -87,7 +104,7 @@ def process_nhs_number(nhs_number: str) -> Dict[str, Any]:
87104 discarded_records .append (detail )
88105
89106 if not matching_records :
90- logger .info ("No records matched PDS demographics: %d" , discarded_count , discarded_records )
107+ module_logger .info ("No records matched PDS demographics: %d %s " , discarded_count , discarded_records )
91108 return make_status ("No records matched PDS demographics; update skipped" , nhs_number )
92109
93110 response = ieds_update_patient_id (
@@ -102,22 +119,26 @@ def process_nhs_number(nhs_number: str) -> Dict[str, Any]:
102119
103120# Function to fetch PDS Patient details and IEDS Immunisation records
104121def fetch_pds_and_ieds_resources (nhs_number : str ):
105- logger .info ("fetch_pds_and_ieds_resources: fetching for %s" , nhs_number )
122+ module_logger .info ("fetch_pds_and_ieds_resources: fetching for %s" , nhs_number )
106123 try :
107124 pds = pds_get_patient_details (nhs_number )
108- logger .info ("fetch_pds_resources: fetching for %s" , pds )
125+ module_logger .info ("fetch_pds_resources: fetching for %s" , pds )
109126 except Exception as e :
110- logger .exception ("fetch_pds_and_ieds_resources: failed to fetch PDS details for %s" , nhs_number )
127+ module_logger .exception (
128+ "fetch_pds_and_ieds_resources: failed to fetch PDS details for %s" , nhs_number
129+ )
111130 raise RuntimeError ("Failed to fetch PDS details" ) from e
112131
113132 try :
114133 ieds = get_items_from_patient_id (nhs_number )
115134 except Exception as e :
116- logger .exception ("fetch_pds_and_ieds_resources: failed to fetch IEDS items for %s" , nhs_number )
135+ module_logger .exception (
136+ "fetch_pds_and_ieds_resources: failed to fetch IEDS items for %s" , nhs_number
137+ )
117138 raise RuntimeError ("Failed to fetch IEDS items" ) from e
118139
119140 count = len (ieds )
120- logger .info ("fetch_pds_and_ieds_resources: fetched PDS and %d IEDS items for %s" , count , nhs_number )
141+ module_logger .info ("fetch_pds_and_ieds_resources: fetched PDS and %d IEDS items for %s" , count , nhs_number )
121142 return pds , ieds
122143
123144
@@ -156,40 +177,45 @@ def normalize_strings(item: Any) -> str | None:
156177 pds_name = normalize_strings (extract_normalized_name_from_patient (pds_details ))
157178 pds_gender = normalize_strings (pds_details .get ("gender" ))
158179 pds_birth = normalize_strings (pds_details .get ("birthDate" ))
159- logger .info ("demographics_match: demographics match for %s" , pds_name , pds_gender , pds_birth )
180+ module_logger .info (
181+ "demographics_match: demographics from PDS: %s %s %s" ,
182+ pds_name ,
183+ pds_gender ,
184+ pds_birth ,
185+ )
160186
161187 # Retrieve patient resource from IEDS item
162188 patient = extract_patient_resource_from_item (ieds_item )
163189 if not patient :
164- logger .info ("demographics_match: no patient resource in IEDS table item" )
190+ module_logger .info ("demographics_match: no patient resource in IEDS table item" )
165191 return False
166192
167193 # normalize patient fields from IEDS
168194 ieds_name = normalize_strings (extract_normalized_name_from_patient (patient ))
169195 ieds_gender = normalize_strings (patient .get ("gender" ))
170196 ieds_birth = normalize_strings (patient .get ("birthDate" ))
171- logger .info ("demographics_match: demographics match for %s" , patient )
197+ module_logger .info ("demographics_match: demographics from IEDS: %s" , patient )
172198
173199 # All required fields must be present
174200 if not all ([pds_name , pds_gender , pds_birth , ieds_name , ieds_gender , ieds_birth ]):
175- logger .info ("demographics_match: missing required demographics" )
201+ module_logger .info ("demographics_match: missing required demographics" )
176202 return False
177203
178204 # Compare fields
179205 if pds_birth != ieds_birth :
180- logger .info ("demographics_match: birthDate mismatch %s != %s" , pds_birth , ieds_birth )
206+ module_logger .info ("demographics_match: birthDate mismatch %s != %s" , pds_birth , ieds_birth )
181207 return False
182208
183209 if pds_gender != ieds_gender :
184- logger .info ("demographics_match: gender mismatch %s != %s" , pds_gender , ieds_gender )
210+ module_logger .info ("demographics_match: gender mismatch %s != %s" , pds_gender , ieds_gender )
185211 return False
186212
187213 if pds_name != ieds_name :
188- logger .info ("demographics_match: name mismatch %s != %s" , pds_name , ieds_name )
214+ module_logger .info ("demographics_match: name mismatch %s != %s" , pds_name , ieds_name )
189215 return False
190216
191- logger .info ("demographics_match: demographics match for %s" , patient )
217+ module_logger .info ("demographics_match: demographics match for %s" , patient )
192218 return True
193219 except Exception :
194- logger .exception ("demographics_match: comparison failed with exception" )
220+ module_logger .exception ("demographics_match: comparison failed with exception" )
195221 return False
0 commit comments