Skip to content

Commit 7088563

Browse files
authored
fix: web validator logging (#2026)
1 parent 6774898 commit 7088563

File tree

9 files changed

+80
-14
lines changed

9 files changed

+80
-14
lines changed

core/src/main/java/org/mobilitydata/gtfsvalidator/performance/MemoryUsageRegister.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public MemoryUsage registerMemoryUsage(String key, MemoryUsage previous) {
8282
*/
8383
public void registerMemoryUsage(MemoryUsage memoryUsage) {
8484
registry.add(memoryUsage);
85-
logger.atInfo().log(memoryUsage.humanReadablePrint());
85+
logger.atFinest().log(memoryUsage.humanReadablePrint());
8686
}
8787

8888
/** Clears the memory usage registry. */

main/src/main/java/org/mobilitydata/gtfsvalidator/util/VersionResolver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ private Optional<String> resolveLatestReleaseVersion(Optional<String> currentVer
171171
Gson gson = new GsonBuilder().create();
172172
VersionResponse response = gson.fromJson(in, VersionResponse.class);
173173
if (response != null && !Strings.isNullOrEmpty(response.version)) {
174-
logger.atInfo().log("resolved release version=%s", response.version);
174+
logger.atFinest().log("resolved release version=%s", response.version);
175175
return Optional.of(response.version);
176176
}
177177
}

web/service/Dockerfile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,9 @@ COPY ${JAR_FILES} /
2626

2727
ADD ./newrelic/newrelic.jar /newrelic/newrelic.jar
2828

29+
ENV SPRING_PROFILES_ACTIVE=cloud
30+
ENV SPRING_MAIN_BANNER-MODE=off
31+
ENV SENTRY_LOGGING_MINIMUM_EVENT_LEVEL=error
32+
ENV SENTRY_LOGGING_MINIMUM_BREADCRUMB_LEVEL=info
33+
2934
ENTRYPOINT exec java -Xmx12g -javaagent:/newrelic/newrelic.jar -jar /service-${CURRENT_VERSION}.jar

web/service/src/main/java/org/mobilitydata/gtfsvalidator/web/service/controller/ValidationController.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.mobilitydata.gtfsvalidator.web.service.util.ValidationJobMetaData;
3131
import org.slf4j.Logger;
3232
import org.slf4j.LoggerFactory;
33+
import org.slf4j.MDC;
3334
import org.springframework.beans.factory.annotation.Autowired;
3435
import org.springframework.http.HttpStatus;
3536
import org.springframework.http.ResponseEntity;
@@ -39,6 +40,7 @@
3940
@RestController
4041
public class ValidationController {
4142

43+
public static final String JOB_ID = "job_id";
4244
private final Logger logger = LoggerFactory.getLogger(ValidationController.class);
4345

4446
@Autowired private StorageHelper storageHelper;
@@ -110,6 +112,9 @@ public ResponseEntity runValidator(
110112

111113
ValidationJobMetaData jobData = getFeedFileMetaData(message);
112114
jobId = jobData.getJobId();
115+
MDC.put(JOB_ID, jobId);
116+
117+
logger.info("Validation started for job ID: {}", jobId);
113118

114119
var fileName = jobData.getFileName();
115120

@@ -142,12 +147,27 @@ public ResponseEntity runValidator(
142147
Sentry.captureException(exc);
143148
throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "Error", exc);
144149
} finally {
150+
MDC.remove(JOB_ID);
145151
// delete the temp file and directory
146-
if (tempFile != null) {
147-
tempFile.delete();
148-
}
152+
safeDeleteFile(tempFile);
149153
if (outputPath != null) {
150-
outputPath.toFile().delete();
154+
safeDeleteFile(outputPath.toFile());
155+
}
156+
}
157+
}
158+
159+
/**
160+
* Deletes the temp file and directory. Exception is logged but not thrown as it's not considered
161+
* a validation error.
162+
*
163+
* @param file to be deleted
164+
*/
165+
private void safeDeleteFile(File file) {
166+
if (file != null && file.exists()) {
167+
try {
168+
file.delete();
169+
} catch (Exception e) {
170+
logger.warn("Error deleting file: {}", file.getAbsolutePath(), e);
151171
}
152172
}
153173
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.mobilitydata.gtfsvalidator.web.service.util;
2+
3+
import java.util.logging.LogManager;
4+
import javax.annotation.PostConstruct;
5+
import org.slf4j.bridge.SLF4JBridgeHandler;
6+
import org.springframework.context.annotation.Configuration;
7+
8+
/**
9+
* This class sets up a bridge between Java Util Logging (JUL) and SLF4J. It resets the JUL root
10+
* logger and installs the SLF4J bridge handler to redirect JUL log messages to SLF4J.
11+
*/
12+
@Configuration
13+
public class LoggingBridgeConfig {
14+
15+
/**
16+
* This method is called after the bean is constructed. It resets the JUL root logger and installs
17+
* the SLF4J bridge handler.
18+
*/
19+
@PostConstruct
20+
public void setupJulToSlf4jBridge() {
21+
LogManager.getLogManager().reset();
22+
SLF4JBridgeHandler.removeHandlersForRootLogger();
23+
SLF4JBridgeHandler.install();
24+
}
25+
}

web/service/src/main/java/org/mobilitydata/gtfsvalidator/web/service/util/StorageHelper.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public void saveJobMetadata(JobMetadata metadata) throws Exception {
7373
var jobBlobInfo = BlobInfo.newBuilder(jobBlobId).setContentType("application/json").build();
7474
var om = new ObjectMapper();
7575
var json = om.writeValueAsString(metadata);
76-
logger.info("Saving job metadata: " + json);
76+
logger.debug("Saving job metadata: {}", json);
7777
storage.create(jobBlobInfo, json.getBytes());
7878
} catch (Exception exc) {
7979
logger.error("Error setting country code", exc);
@@ -93,13 +93,13 @@ public JobMetadata getJobMetadata(String jobId) {
9393
var jobBlobId = BlobId.of(JOB_INFO_BUCKET_NAME, jobInfoPath);
9494
Blob blob = storage.get(jobBlobId);
9595
var json = new String(blob.getContent());
96-
logger.info("Loading job metadata: " + json);
96+
logger.debug("Loading job metadata: {}", json);
9797

9898
var objectMapper = new ObjectMapper();
9999
JobMetadata jobMetadata = objectMapper.readValue(json, JobMetadata.class);
100100
return jobMetadata;
101101
} catch (Exception exc) {
102-
logger.error("Error could not load remote file, using default country code", exc);
102+
logger.debug("No metadata found using default country code");
103103
return new JobMetadata(jobId, "");
104104
}
105105
}
@@ -204,10 +204,10 @@ public void writeExecutionResultFile(
204204

205205
Path executionResultPath = outputPath.resolve(executionResultFile);
206206
try {
207-
logger.info("Writing executionResult file to " + executionResultFile);
207+
logger.debug("Writing executionResult file to " + executionResultFile);
208208
Files.write(
209209
executionResultPath, gson.toJson(executionResult).getBytes(StandardCharsets.UTF_8));
210-
logger.info(executionResultFile + " file written successfully");
210+
logger.debug(executionResultFile + " file written successfully");
211211
} catch (IOException e) {
212212
logger.error("Error writing to file " + executionResultFile);
213213
e.printStackTrace();

web/service/src/main/java/org/mobilitydata/gtfsvalidator/web/service/util/ValidationHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public void validateFeed(@NonNull File feedFile, @NonNull Path outputPath, Strin
3535
.setOutputDirectory(outputPath);
3636
if (!countryCode.isEmpty()) {
3737
var country = CountryCode.forStringOrUnknown(countryCode);
38-
logger.info("setting country code: " + country.getCountryCode());
38+
logger.debug("setting country code: {}", country.getCountryCode());
3939
configBuilder.setCountryCode(CountryCode.forStringOrUnknown(countryCode));
4040
}
4141
var config = configBuilder.build();

web/service/src/main/resources/logback.xml renamed to web/service/src/main/resources/logback-spring.xml

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<configuration>
3-
<include resource="org/springframework/boot/logging/logback/base.xml"/>
4-
53
<springProfile name="local">
64
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
75
<encoder>
@@ -26,6 +24,20 @@
2624
</layout>
2725
</encoder>
2826
</appender>
27+
28+
<!-- Suppress INFO logs from the GTFS validator tables to reduce noise -->
29+
<logger name="org.mobilitydata.gtfsvalidator.table" level="WARN" additivity="false" />
30+
<!-- Suppress Spring Boot startup noise -->
31+
<logger name="org.springframework.boot" level="WARN" />
32+
<logger name="org.springframework.context" level="WARN" />
33+
<logger name="org.springframework.beans.factory" level="WARN" />
34+
<logger name="org.apache.catalina" level="WARN" />
35+
<logger name="org.apache.coyote" level="WARN" />
36+
<logger name="org.apache.tomcat" level="WARN" />
37+
<logger name="org.springframework.web" level="WARN" additivity="false" />
38+
<logger name="com.google.cloud.spring.core" level="WARN" />
39+
<logger name="com.google.cloud.spring.autoconfigure" level="WARN" />
40+
2941
<root level="INFO">
3042
<appender-ref ref="CONSOLE_JSON" />
3143
</root>

web/service/src/test/java/org/mobilitydata/gtfsvalidator/web/service/controller/RunValidatorEndpointTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ public void runValidatorSuccess() throws Exception {
8383
.when(storageHelper)
8484
.downloadFeedFileFromStorage(anyString(), anyString());
8585

86+
doReturn(true).when(mockFeedFile).exists();
87+
doReturn(true).when(mockOutputPathToFile).exists();
8688
mockMvc
8789
.perform(
8890
MockMvcRequestBuilders.post("/run-validator")
@@ -101,7 +103,9 @@ public void runValidatorSuccess() throws Exception {
101103
verify(storageHelper, times(1)).uploadFilesToStorage(testJobId, mockOutputPath);
102104

103105
// verify that the temp files and directory are deleted
106+
verify(mockFeedFile, times(1)).exists();
104107
verify(mockFeedFile, times(1)).delete();
108+
verify(mockOutputPathToFile, times(1)).exists();
105109
verify(mockOutputPathToFile, times(1)).delete();
106110
}
107111

0 commit comments

Comments
 (0)