diff --git a/core/src/main/java/org/elasticsearch/bootstrap/Elasticsearch.java b/core/src/main/java/org/elasticsearch/bootstrap/Elasticsearch.java index 62b01f3fe85..643ad812972 100644 --- a/core/src/main/java/org/elasticsearch/bootstrap/Elasticsearch.java +++ b/core/src/main/java/org/elasticsearch/bootstrap/Elasticsearch.java @@ -92,6 +92,15 @@ class Elasticsearch extends EnvironmentAwareCommand { return elasticsearch.main(args, terminal); } + @Override + protected boolean shouldConfigureLoggingWithoutConfig() { + /* + * If we allow logging to be configured without a config before we ready to read the log4j2.properties file, then we will fail to + * detect uses of logging before it is properly configured. + */ + return false; + } + @Override protected void execute(Terminal terminal, OptionSet options, Environment env) throws UserException { if (options.nonOptionArguments().isEmpty() == false) { diff --git a/core/src/main/java/org/elasticsearch/cli/Command.java b/core/src/main/java/org/elasticsearch/cli/Command.java index 99a9a7e43d9..a60dece2611 100644 --- a/core/src/main/java/org/elasticsearch/cli/Command.java +++ b/core/src/main/java/org/elasticsearch/cli/Command.java @@ -79,10 +79,12 @@ public abstract class Command implements Closeable { Runtime.getRuntime().addShutdownHook(shutdownHookThread.get()); } - // initialize default for es.logger.level because we will not read the log4j2.properties - final String loggerLevel = System.getProperty("es.logger.level", Level.INFO.name()); - final Settings settings = Settings.builder().put("logger.level", loggerLevel).build(); - LogConfigurator.configureWithoutConfig(settings); + if (shouldConfigureLoggingWithoutConfig()) { + // initialize default for es.logger.level because we will not read the log4j2.properties + final String loggerLevel = System.getProperty("es.logger.level", Level.INFO.name()); + final Settings settings = Settings.builder().put("logger.level", loggerLevel).build(); + LogConfigurator.configureWithoutConfig(settings); + } try { mainWithoutErrorHandling(args, terminal); @@ -100,6 +102,16 @@ public abstract class Command implements Closeable { return ExitCodes.OK; } + /** + * Indicate whether or not logging should be configured without reading a log4j2.properties. Most commands should do this because we do + * not configure logging for CLI tools. Only commands that configure logging on their own should not do this. + * + * @return true if logging should be configured without reading a log4j2.properties file + */ + protected boolean shouldConfigureLoggingWithoutConfig() { + return true; + } + /** * Executes the command, but all errors are thrown. */