...
This section contains recommendations about what must and what must not be contained in log messages
1.1 Log message must be informative.
There should be no messages like "Start processing", "Exiting". Messages must always contain parameters/indicators to link with processes or entities
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
public Future<Boolean> deleteByJobExecutionId(String jobExecutionId, String tenantId) { LOGGER.debug("Trying to delete row from the {} table by jobExecutionId = {}", JOURNAL_RECORDS_TABLE, jobExecutionId); |
1.2 Business code logging
Controller endpoints or methods containing business must have at least two messages:
...
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
public int sumWithCondition(int a, int b, int cond) { LOGGER.debug("sumWithCondition:: parameters a: {}, b: {}, cond: {}", a, b, cond); int sumResult; if (a > cond) { LOGGER.info("sumWithCondition:: a > cond"); sumResult = a + b; } else { LOGGER.info("sumWithCondition:: a <= cond"); sumResult = cond + b; } LOGGER.info("sumWithCondition:: result: {}", sumResult); return sumResult; } |
1.3 Branching and conditions
Branching conditions and decisions need to be logged at INFO/DEBUG levels
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
private CompletableFuture<Optional<MappingParameters>> loadMappingParametersSnapshot(String jobExecutionId, OkapiConnectionParams params) { LOGGER.debug("loadMappingParametersSnapshot:: Trying to load MappingParametersSnapshot by jobExecutionId '{}' for cache, okapi url: {}, tenantId: {}", jobExecutionId, params.getOkapiUrl(), params.getTenantId()); return RestUtil.doRequest(params, "/mapping-metadata/"+ jobExecutionId, HttpMethod.GET, null) .toCompletionStage() .toCompletableFuture() .thenCompose(httpResponse -> { if (httpResponse.getResponse().statusCode() == HttpStatus.SC_OK) { LOGGER.info("loadMappingParametersSnapshot:: MappingParametersSnapshot was loaded by jobExecutionId '{}'", jobExecutionId); return CompletableFuture.completedFuture(Optional.of(Json.decodeValue(httpResponse.getJson().getString("mappingParams"), MappingParameters.class))); } else if (httpResponse.getResponse().statusCode() == HttpStatus.SC_NOT_FOUND) { LOGGER.warn("loadMappingParametersSnapshot:: MappingParametersSnapshot was not found by jobExecutionId '{}'", jobExecutionId); return CompletableFuture.completedFuture(Optional.empty()); } else { String message = String.format("loadMappingParametersSnapshot:: Error loading MappingParametersSnapshot by jobExecutionId: '%s', status code: %s, response message: %s", jobExecutionId, httpResponse.getResponse().statusCode(), httpResponse.getBody()); LOGGER.warn(message); return CompletableFuture.failedFuture(new CacheLoadingException(message)); } }); } } |
1.4 Exception and error handling
In case of expected (handled) exception, there must be a WARN level log message.
...