Skip to content

Commit 8f44caf

Browse files
[DPC-4950] Add exception class to JSON log format (#2860)
## 🎫 Ticket https://jira.cms.gov/browse/DPC-4950 ## 🛠 Changes Adds exception class to JSON log format. ## ℹ️ Context Allows for faster log searches. ## 🧪 Validation Test updated. log example from smoke test: ``` {"timestamp":"2026-01-05T18:03:49.477+0000", "level":"ERROR", "thread":"RxComputationThreadPool-1", "logger":"gov.cms.dpc.aggregation.engine.JobBatchProcessor", "message":"Failed to retrieve Patient", "exception":"ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException: No patient found with ID: \n\tat gov.cms.dpc.bluebutton.client.MockBlueButtonClient.formNoPatientException(MockBlueButtonClient.java:242)...", "mdc":{"jobID":"e6fec28a-abe0-4906-88ad-2a738ce289b9","is_bulk":"true","organization_id":"0ab352f1-2bf1-44c4-aa7a-3004a1ffef12","aggregatorId":"fbc25203-a54e-4d88-83b5-d34134504962","batchID":"d7f12dae-db60-4d26-82ef-7f4575a14fe0","is_v2":"false"}, "environment":"local", "application":"dpc-aggregation", "version":"unknown_version", "exceptionClass":"ResourceNotFoundException"} ```
1 parent cb4883d commit 8f44caf

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

dpc-common/src/main/java/gov/cms/dpc/common/logging/DPCJsonLayout.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import ch.qos.logback.classic.pattern.ThrowableHandlingConverter;
44
import ch.qos.logback.classic.spi.ILoggingEvent;
5+
import ch.qos.logback.classic.spi.IThrowableProxy;
56
import com.google.re2j.Pattern;
67
import io.dropwizard.logging.json.EventAttribute;
78
import io.dropwizard.logging.json.layout.EventJsonLayout;
@@ -48,10 +49,16 @@ protected Map<String, Object> toJsonMap(ILoggingEvent event) {
4849
if(map.get(EXCEPTION) != null){
4950
String maskedExceptionDetails = maskPSQLData(map.get(EXCEPTION).toString());
5051
map.put(EXCEPTION, maskedExceptionDetails);
52+
map.put("exceptionClass", getExceptionClass(event.getThrowableProxy()));
5153
}
5254
return map;
5355
}
5456

57+
private String getExceptionClass(IThrowableProxy e) {
58+
String[] tokens = e.getClassName().split("\\.");
59+
return tokens[tokens.length - 1];
60+
}
61+
5562
private void parseJsonMessageIfPossible(Map<String, Object> map, String message) {
5663
try {
5764
Map<String, String> mappedMessage = splitToMap(message);

dpc-common/src/test/java/gov/cms/dpc/common/logging/DPCJsonLayoutUnitTest.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,18 @@
99
import io.dropwizard.logging.json.EventAttribute;
1010
import io.dropwizard.logging.json.layout.JsonFormatter;
1111
import io.dropwizard.logging.json.layout.TimestampFormatter;
12+
import org.hibernate.exception.ConstraintViolationException;
1213
import org.junit.jupiter.api.BeforeEach;
1314
import org.junit.jupiter.api.Test;
1415
import org.mockito.Mock;
1516
import org.mockito.MockitoAnnotations;
1617
import org.slf4j.LoggerFactory;
17-
import org.hibernate.exception.ConstraintViolationException;
18-
import java.sql.SQLException;
1918

20-
import java.util.*;
19+
import java.sql.SQLException;
20+
import java.util.HashMap;
21+
import java.util.HashSet;
22+
import java.util.Map;
23+
import java.util.Set;
2124

2225
import static org.junit.jupiter.api.Assertions.assertEquals;
2326
import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -185,6 +188,7 @@ public void testPostgresMaskingOnException() {
185188

186189
Map<String, Object> map = dpcJsonLayout.toJsonMap(loggingEvent);
187190
assertEquals(expectedLogMessage, map.get("exception"));
191+
assertEquals("ConstraintViolationException", map.get("exceptionClass"));
188192
}
189193

190194
@Test

0 commit comments

Comments
 (0)