From aa8d1740e40eb29cf7bbca80e68a2b896b5df452 Mon Sep 17 00:00:00 2001 From: Robert Muir Date: Fri, 25 Sep 2015 14:46:12 -0400 Subject: [PATCH] Don't log multi-megabyte guice exceptions. Instead just log the same thing we print to the startup console for that case (magic logic), it sucks to do this, but guice exceptions are too much. All other non-guice exceptions will still be fully logged. Closes #13782 --- .../org/elasticsearch/bootstrap/Bootstrap.java | 16 +++++++++++++++- .../elasticsearch/bootstrap/StartupError.java | 6 +++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/bootstrap/Bootstrap.java b/core/src/main/java/org/elasticsearch/bootstrap/Bootstrap.java index c9c3eeb8974..302097a7229 100644 --- a/core/src/main/java/org/elasticsearch/bootstrap/Bootstrap.java +++ b/core/src/main/java/org/elasticsearch/bootstrap/Bootstrap.java @@ -27,6 +27,7 @@ import org.elasticsearch.common.SuppressForbidden; import org.elasticsearch.common.cli.CliTool; import org.elasticsearch.common.cli.Terminal; import org.elasticsearch.common.collect.Tuple; +import org.elasticsearch.common.inject.CreationException; import org.elasticsearch.common.lease.Releasables; import org.elasticsearch.common.logging.ESLogger; import org.elasticsearch.common.logging.Loggers; @@ -40,6 +41,8 @@ import org.elasticsearch.node.Node; import org.elasticsearch.node.NodeBuilder; import org.elasticsearch.node.internal.InternalSettingsPreparer; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; import java.util.Locale; import java.util.concurrent.CountDownLatch; @@ -287,7 +290,18 @@ final class Bootstrap { if (INSTANCE.node != null) { logger = Loggers.getLogger(Bootstrap.class, INSTANCE.node.settings().get("name")); } - logger.error("Exception", e); + // HACK, it sucks to do this, but we will run users out of disk space otherwise + if (e instanceof CreationException) { + // guice: log the shortened exc to the log file + ByteArrayOutputStream os = new ByteArrayOutputStream(); + PrintStream ps = new PrintStream(os, false, "UTF-8"); + new StartupError(e).printStackTrace(ps); + ps.flush(); + logger.error("Guice Exception: {}", os.toString("UTF-8")); + } else { + // full exception + logger.error("Exception", e); + } // re-enable it if appropriate, so they can see any logging during the shutdown process if (foreground) { Loggers.enableConsoleLogging(); diff --git a/core/src/main/java/org/elasticsearch/bootstrap/StartupError.java b/core/src/main/java/org/elasticsearch/bootstrap/StartupError.java index 9a5df8ebcad..781aac31f65 100644 --- a/core/src/main/java/org/elasticsearch/bootstrap/StartupError.java +++ b/core/src/main/java/org/elasticsearch/bootstrap/StartupError.java @@ -97,7 +97,11 @@ final class StartupError extends RuntimeException { linesWritten++; } } - s.println("Refer to the log for complete error details."); + // if its a guice exception, the whole thing really will not be in the log, its megabytes. + // refer to the hack in bootstrap, where we don't log it + if (originalCause instanceof CreationException == false) { + s.println("Refer to the log for complete error details."); + } } /**