Skip to content

Commit

Permalink
Add logfilter to the Admin Change Log Level JSON RC API (hyperledger#…
Browse files Browse the repository at this point in the history
…1895)

Allows setting the log level for specific packages or classes dynamically.
Signed-off-by: Adrian Sutton <adrian.sutton@consensys.net>
  • Loading branch information
matkt authored and ajsutton committed Sep 2, 2019
1 parent a047286 commit 235c72a
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@
import tech.pegasys.pantheon.ethereum.jsonrpc.internal.response.JsonRpcResponse;
import tech.pegasys.pantheon.ethereum.jsonrpc.internal.response.JsonRpcSuccessResponse;

import java.util.Arrays;
import java.util.Optional;

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
Expand All @@ -44,11 +47,20 @@ public String getName() {
public JsonRpcResponse response(final JsonRpcRequest request) {
try {
final Level logLevel = parameters.required(request.getParams(), 0, Level.class);
LOG.log(Level.OFF, "Setting logging level to {}", logLevel.name());
Configurator.setAllLevels("", logLevel);
final Optional<String[]> optionalLogFilters =
parameters.optional(request.getParams(), 1, String[].class);
optionalLogFilters.ifPresentOrElse(
logFilters ->
Arrays.stream(logFilters).forEach(logFilter -> setLogLevel(logFilter, logLevel)),
() -> setLogLevel("", logLevel));
return new JsonRpcSuccessResponse(request.getId());
} catch (InvalidJsonRpcParameters invalidJsonRpcParameters) {
return new JsonRpcErrorResponse(request.getId(), JsonRpcError.INVALID_PARAMS);
}
}

private void setLogLevel(final String logFilter, final Level logLevel) {
LOG.log(Level.OFF, "Setting {} logging level to {} ", logFilter, logLevel.name());
Configurator.setAllLevels(logFilter, logLevel);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public void shouldReturnExpectedMethodName() {
}

@Test
public void shouldReturnCorrectResponse() {
public void shouldReturnCorrectResponseWhenRequestHasLogLevel() {
final JsonRpcRequest request =
new JsonRpcRequest("2.0", "admin_changeLogLevel", new Object[] {Level.DEBUG});
final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse(request.getId());
Expand All @@ -64,6 +64,29 @@ public void shouldReturnCorrectResponse() {
assertEquals(Level.DEBUG, levelAfterJsonRpcRequest);
}

@Test
public void shouldReturnCorrectResponseWhenRequestHasLogLevelAndFilters() {
final JsonRpcRequest request =
new JsonRpcRequest(
"2.0", "admin_changeLogLevel", new Object[] {Level.DEBUG, new String[] {"com"}});
final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse(request.getId());

final Level levelOfAllProjectBeforeJsonRpcRequest = LogManager.getLogger().getLevel();
final Level levelWithSpecificPackageBeforeJsonRpcRequest =
LogManager.getLogger("com").getLevel();
final JsonRpcSuccessResponse actualResponse =
(JsonRpcSuccessResponse) adminChangeLogLevel.response(request);
final Level levelOfAllProjectAfterJsonRpcRequest = LogManager.getLogger().getLevel();
final Level levelWithSpecificPackageAfterJsonRpcRequest =
LogManager.getLogger("com").getLevel();

assertThat(actualResponse).isEqualToComparingFieldByField(expectedResponse);
assertEquals(Level.INFO, levelOfAllProjectBeforeJsonRpcRequest);
assertEquals(Level.INFO, levelOfAllProjectAfterJsonRpcRequest);
assertEquals(Level.INFO, levelWithSpecificPackageBeforeJsonRpcRequest);
assertEquals(Level.DEBUG, levelWithSpecificPackageAfterJsonRpcRequest);
}

@Test
public void requestHasValidStringLogLevelParameter() {
final JsonRpcRequest request =
Expand Down Expand Up @@ -101,4 +124,15 @@ public void requestHasInvalidStringLogLevelParameter() {
final JsonRpcResponse actualResponse = adminChangeLogLevel.response(request);
assertThat(actualResponse).isEqualToComparingFieldByField(expectedResponse);
}

@Test
public void requestHasInvalidLogFilterParameter() {
final JsonRpcRequest request =
new JsonRpcRequest("2.0", "admin_changeLogLevel", new Object[] {"DEBUG", "INVALID"});
final JsonRpcResponse expectedResponse =
new JsonRpcErrorResponse(request.getId(), JsonRpcError.INVALID_PARAMS);

final JsonRpcResponse actualResponse = adminChangeLogLevel.response(request);
assertThat(actualResponse).isEqualToComparingFieldByField(expectedResponse);
}
}

0 comments on commit 235c72a

Please sign in to comment.