Skip to content

Commit af0d500

Browse files
committed
Set root logger level for CLIs (elastic#123742)
All CLIs in elasticsearch support command line flags for controlling the output level. When --silent is used, the expectation is that normal logging is omitted. Yet the log4j logger is still configured to output error level logs. This commit sets the appropriate log level for log4j depending on the Terminal log level.
1 parent 2c3e84d commit af0d500

File tree

9 files changed

+82
-5
lines changed

9 files changed

+82
-5
lines changed

libs/cli/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ apply plugin: 'elasticsearch.publish'
1212
dependencies {
1313
api 'net.sf.jopt-simple:jopt-simple:5.0.2'
1414
api project(':libs:core')
15+
api project(':libs:logging')
1516

1617
testImplementation(project(":test:framework")) {
1718
exclude group: 'org.elasticsearch', module: 'cli'

libs/cli/src/main/java/module-info.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
module org.elasticsearch.cli {
1212
requires jopt.simple;
1313
requires org.elasticsearch.base;
14+
requires java.logging;
15+
requires org.elasticsearch.logging;
1416

1517
exports org.elasticsearch.cli;
1618
}

libs/cli/src/main/java/org/elasticsearch/cli/Command.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import joptsimple.OptionSpec;
1616

1717
import org.elasticsearch.core.SuppressForbidden;
18+
import org.elasticsearch.logging.Level;
19+
import org.elasticsearch.logging.internal.spi.LoggerFactory;
1820

1921
import java.io.Closeable;
2022
import java.io.IOException;
@@ -84,12 +86,16 @@ protected void mainWithoutErrorHandling(String[] args, Terminal terminal, Proces
8486
return;
8587
}
8688

89+
LoggerFactory loggerFactory = LoggerFactory.provider();
8790
if (options.has(silentOption)) {
8891
terminal.setVerbosity(Terminal.Verbosity.SILENT);
92+
loggerFactory.setRootLevel(Level.OFF);
8993
} else if (options.has(verboseOption)) {
9094
terminal.setVerbosity(Terminal.Verbosity.VERBOSE);
95+
loggerFactory.setRootLevel(Level.DEBUG);
9196
} else {
9297
terminal.setVerbosity(Terminal.Verbosity.NORMAL);
98+
loggerFactory.setRootLevel(Level.INFO);
9399
}
94100

95101
execute(terminal, options, processInfo);

libs/logging/src/main/java/module-info.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@
99

1010
module org.elasticsearch.logging {
1111
exports org.elasticsearch.logging;
12-
exports org.elasticsearch.logging.internal.spi to org.elasticsearch.server;
12+
exports org.elasticsearch.logging.internal.spi to org.elasticsearch.server, org.elasticsearch.cli;
1313
}

libs/logging/src/main/java/org/elasticsearch/logging/internal/spi/LoggerFactory.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
package org.elasticsearch.logging.internal.spi;
1111

12+
import org.elasticsearch.logging.Level;
1213
import org.elasticsearch.logging.Logger;
1314

1415
/**
@@ -26,6 +27,10 @@ public static LoggerFactory provider() {
2627

2728
public abstract Logger getLogger(Class<?> clazz);
2829

30+
public abstract void setRootLevel(Level level);
31+
32+
public abstract Level getRootLevel();
33+
2934
public static void setInstance(LoggerFactory INSTANCE) {
3035
LoggerFactory.INSTANCE = INSTANCE;
3136
}

server/src/main/java/org/elasticsearch/common/logging/internal/LevelUtil.java

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,51 @@
99

1010
package org.elasticsearch.common.logging.internal;
1111

12+
import static org.apache.logging.log4j.Level.ALL;
13+
import static org.apache.logging.log4j.Level.DEBUG;
14+
import static org.apache.logging.log4j.Level.ERROR;
15+
import static org.apache.logging.log4j.Level.FATAL;
16+
import static org.apache.logging.log4j.Level.INFO;
17+
import static org.apache.logging.log4j.Level.OFF;
18+
import static org.apache.logging.log4j.Level.TRACE;
19+
import static org.apache.logging.log4j.Level.WARN;
20+
1221
public final class LevelUtil {
1322

1423
private LevelUtil() {}
1524

1625
public static org.apache.logging.log4j.Level log4jLevel(final org.elasticsearch.logging.Level level) {
1726
return switch (level) {
18-
case OFF -> org.apache.logging.log4j.Level.OFF;
19-
case FATAL -> org.apache.logging.log4j.Level.FATAL;
27+
case OFF -> OFF;
28+
case FATAL -> FATAL;
2029
case ERROR -> org.apache.logging.log4j.Level.ERROR;
21-
case WARN -> org.apache.logging.log4j.Level.WARN;
30+
case WARN -> WARN;
2231
case INFO -> org.apache.logging.log4j.Level.INFO;
2332
case DEBUG -> org.apache.logging.log4j.Level.DEBUG;
24-
case TRACE -> org.apache.logging.log4j.Level.TRACE;
33+
case TRACE -> TRACE;
2534
case ALL -> org.apache.logging.log4j.Level.ALL;
2635
};
2736
}
37+
38+
public static org.elasticsearch.logging.Level elasticsearchLevel(final org.apache.logging.log4j.Level log4jLevel) {
39+
// we can't use a switch because log4j levels are not an enum
40+
if (log4jLevel == OFF) {
41+
return org.elasticsearch.logging.Level.OFF;
42+
} else if (log4jLevel == FATAL) {
43+
return org.elasticsearch.logging.Level.FATAL;
44+
} else if (log4jLevel == ERROR) {
45+
return org.elasticsearch.logging.Level.ERROR;
46+
} else if (log4jLevel == WARN) {
47+
return org.elasticsearch.logging.Level.WARN;
48+
} else if (log4jLevel == INFO) {
49+
return org.elasticsearch.logging.Level.INFO;
50+
} else if (log4jLevel == DEBUG) {
51+
return org.elasticsearch.logging.Level.DEBUG;
52+
} else if (log4jLevel == TRACE) {
53+
return org.elasticsearch.logging.Level.TRACE;
54+
} else if (log4jLevel == ALL) {
55+
return org.elasticsearch.logging.Level.ALL;
56+
}
57+
throw new AssertionError("unknown log4j level [" + log4jLevel + "]");
58+
}
2859
}

server/src/main/java/org/elasticsearch/common/logging/internal/LoggerFactoryImpl.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
package org.elasticsearch.common.logging.internal;
1111

1212
import org.apache.logging.log4j.LogManager;
13+
import org.elasticsearch.common.logging.Loggers;
14+
import org.elasticsearch.logging.Level;
1315
import org.elasticsearch.logging.Logger;
1416
import org.elasticsearch.logging.internal.spi.LoggerFactory;
1517

@@ -30,4 +32,15 @@ public Logger getLogger(Class<?> clazz) {
3032
// classloader a class comes from, we will use the root logging config.
3133
return getLogger(clazz.getName());
3234
}
35+
36+
@Override
37+
public void setRootLevel(Level level) {
38+
var log4jLevel = LevelUtil.log4jLevel(level);
39+
Loggers.setLevel(LogManager.getRootLogger(), log4jLevel);
40+
}
41+
42+
@Override
43+
public Level getRootLevel() {
44+
return LevelUtil.elasticsearchLevel(LogManager.getRootLogger().getLevel());
45+
}
3346
}

test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@
117117
import org.elasticsearch.indices.IndicesModule;
118118
import org.elasticsearch.indices.analysis.AnalysisModule;
119119
import org.elasticsearch.jdk.RuntimeVersionFeature;
120+
import org.elasticsearch.logging.internal.spi.LoggerFactory;
120121
import org.elasticsearch.plugins.AnalysisPlugin;
121122
import org.elasticsearch.plugins.Plugin;
122123
import org.elasticsearch.plugins.scanners.StablePluginsRegistry;
@@ -576,6 +577,23 @@ public void removeHeaderWarningAppender() {
576577
}
577578
}
578579

580+
private static org.elasticsearch.logging.Level capturedLogLevel = null;
581+
582+
// just capture the expected level once before the suite starts
583+
@BeforeClass
584+
public static void captureLoggingLevel() {
585+
capturedLogLevel = LoggerFactory.provider().getRootLevel();
586+
}
587+
588+
@AfterClass
589+
public static void restoreLoggingLevel() {
590+
if (capturedLogLevel != null) {
591+
// log level might not have been captured if suite was skipped
592+
LoggerFactory.provider().setRootLevel(capturedLogLevel);
593+
capturedLogLevel = null;
594+
}
595+
}
596+
579597
@Before
580598
public final void before() {
581599
LeakTracker.setContextHint(getTestName());

x-pack/plugin/security/src/main/java/module-info.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
requires oauth2.oidc.sdk;
5050
requires org.slf4j;
5151
requires unboundid.ldapsdk;
52+
requires org.elasticsearch.logging;
5253

5354
exports org.elasticsearch.xpack.security.action to org.elasticsearch.server;
5455
exports org.elasticsearch.xpack.security.action.apikey to org.elasticsearch.server;

0 commit comments

Comments
 (0)