Skip to content

Commit e0db5bc

Browse files
committed
RMB-1036: Initialize loggers before setting log level
https://folio-org.atlassian.net/browse/RMB-1036 Before setting a log level for a class using PUT /admin/loglevel?level=WARN&java_package=org.folio.cql2pgjson.CQL2PgJSON we need to create the logger for that class. It may not have been used since startup. See https://folio-org.atlassian.net/wiki/spaces/SYSOPS/pages/1407189020/RMB+log+level for details. If multiple comma separated class names are passed each should be handled. (cherry picked from commit 238cac8)
1 parent 14491cb commit e0db5bc

3 files changed

Lines changed: 45 additions & 14 deletions

File tree

domain-models-api-interfaces/ramls/admin.raml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ traits:
4040
example: "Internal server error, contact administrator"
4141
/loglevel:
4242
put:
43-
description: Set logging level for all loggers in the JVM or just for a specific package / class
43+
description: Set logging level for the comma separated list of class names. Use * as tailing wildcard to match all or specific loggers provided they have been used since startup
4444
is: [log-level]
4545
responses:
4646
200:

domain-models-runtime/src/main/java/org/folio/rest/tools/utils/LogUtil.java

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -104,26 +104,39 @@ private static String injectDeploymentId(){
104104

105105
/**
106106
* Update the log level for all packages / a specific package / a specific class
107-
* @param packageName - pass "*" for all packages
107+
* @param packageNames - pass "*" for all packages, use comma to separate multiple names
108108
* @param level - see {@link Level}
109109
* @return - JsonObject with a list of updated loggers and their levels
110110
*/
111-
public static JsonObject updateLogConfiguration(String packageName, String level){
111+
public static JsonObject updateLogConfiguration(String packageNames, String level) {
112+
var updatedLoggers = new JsonObject();
113+
if (packageNames == null) {
114+
return updatedLoggers;
115+
}
116+
for (var packageName : packageNames.split(",")) {
117+
updateLogConfiguration(packageName, level, updatedLoggers);
118+
}
119+
return updatedLoggers;
120+
}
121+
122+
private static void updateLogConfiguration(String packageName, String level, JsonObject updatedLoggers) {
123+
var prefix = packageName.replace("*", "");
124+
if (prefix.equals(packageName)) {
125+
// create the logger, it might not have been used since container startup
126+
LogManager.getLogger(packageName);
127+
}
112128

113-
JsonObject updatedLoggers = new JsonObject();
114129
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
115-
Collection<org.apache.logging.log4j.core.Logger> allLoggers = ctx.getLoggers();
116130

117-
allLoggers.forEach( log -> {
118-
if(log != null && packageName != null && (log.getName().startsWith(packageName.replace("*", "")) || "*".equals(packageName)) ){
119-
if(log != null){
120-
log.setLevel(getLog4jLevel(level));
121-
updatedLoggers.put(log.getName(), log.getLevel().toString());
122-
}
131+
for (var log: ctx.getLoggers()) {
132+
if (log == null) {
133+
continue;
123134
}
124-
});
125-
126-
return updatedLoggers;
135+
if (log.getName().startsWith(prefix)) {
136+
log.setLevel(getLog4jLevel(level));
137+
updatedLoggers.put(log.getName(), log.getLevel().toString());
138+
}
139+
}
127140
}
128141

129142
/**

domain-models-runtime/src/test/java/org/folio/rest/tools/utils/LogUtilIT.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,4 +111,22 @@ public void append(LogEvent event) {
111111
message.append(event.getMessage().getFormattedMessage());
112112
}
113113
}
114+
115+
@Test
116+
void updateLogConfigurationUnused() {
117+
LogUtil.updateLogConfiguration("some.package.UnusedClass", "ERROR");
118+
assertThat(LogManager.getLogger("some.package.UnusedClass").getLevel(), is(Level.ERROR));
119+
}
120+
121+
@Test
122+
void updateLogConfiguration3() {
123+
LogUtil.updateLogConfiguration("foo.X,bar.Y,baz.Z", "WARN");
124+
assertThat(LogManager.getLogger("foo.X").getLevel(), is(Level.WARN));
125+
assertThat(LogManager.getLogger("bar.Y").getLevel(), is(Level.WARN));
126+
assertThat(LogManager.getLogger("baz.Z").getLevel(), is(Level.WARN));
127+
LogUtil.updateLogConfiguration("foo.*,bar.*,baz.*", "DEBUG");
128+
assertThat(LogManager.getLogger("foo.X").getLevel(), is(Level.DEBUG));
129+
assertThat(LogManager.getLogger("bar.Y").getLevel(), is(Level.DEBUG));
130+
assertThat(LogManager.getLogger("baz.Z").getLevel(), is(Level.DEBUG));
131+
}
114132
}

0 commit comments

Comments
 (0)