|
@@ -22,6 +22,7 @@ import org.elasticsearch.gradle.Version;
|
|
|
import org.elasticsearch.gradle.VersionProperties;
|
|
|
import org.elasticsearch.gradle.http.WaitForHttpResource;
|
|
|
import org.elasticsearch.gradle.info.BuildParams;
|
|
|
+import org.elasticsearch.gradle.util.Pair;
|
|
|
import org.gradle.api.Action;
|
|
|
import org.gradle.api.Named;
|
|
|
import org.gradle.api.NamedDomainObjectContainer;
|
|
@@ -83,6 +84,7 @@ import java.util.stream.Collectors;
|
|
|
import java.util.stream.Stream;
|
|
|
|
|
|
import static java.util.Objects.requireNonNull;
|
|
|
+import static java.util.Optional.ofNullable;
|
|
|
|
|
|
public class ElasticsearchNode implements TestClusterConfiguration {
|
|
|
|
|
@@ -948,7 +950,7 @@ public class ElasticsearchNode implements TestClusterConfiguration {
|
|
|
}
|
|
|
|
|
|
private void logFileContents(String description, Path from, boolean tailLogs) {
|
|
|
- final Map<String, Integer> errorsAndWarnings = new LinkedHashMap<>();
|
|
|
+ final Map<String, Pair<String, Integer>> errorsAndWarnings = new LinkedHashMap<>();
|
|
|
LinkedList<String> ring = new LinkedList<>();
|
|
|
try (LineNumberReader reader = new LineNumberReader(Files.newBufferedReader(from))) {
|
|
|
for (String line = reader.readLine(); line != null; line = reader.readLine()) {
|
|
@@ -960,10 +962,18 @@ public class ElasticsearchNode implements TestClusterConfiguration {
|
|
|
lineToAdd = line;
|
|
|
// check to see if the previous message (possibly combined from multiple lines) was an error or
|
|
|
// warning as we want to show all of them
|
|
|
- String previousMessage = normalizeLogLine(ring.getLast());
|
|
|
- if (MESSAGES_WE_DONT_CARE_ABOUT.stream().noneMatch(previousMessage::contains)
|
|
|
- && (previousMessage.contains("ERROR") || previousMessage.contains("WARN"))) {
|
|
|
- errorsAndWarnings.put(ring.getLast(), errorsAndWarnings.getOrDefault(previousMessage, 0) + 1);
|
|
|
+ String normalizedMessage = normalizeLogLine(ring.getLast());
|
|
|
+ if (MESSAGES_WE_DONT_CARE_ABOUT.stream().noneMatch(normalizedMessage::contains)
|
|
|
+ && (normalizedMessage.contains("ERROR") || normalizedMessage.contains("WARN"))) {
|
|
|
+
|
|
|
+ // De-duplicate repeated errors
|
|
|
+ errorsAndWarnings.put(
|
|
|
+ normalizedMessage,
|
|
|
+ Pair.of(
|
|
|
+ ring.getLast(), // Original, non-normalized message (so we keep the first timestamp)
|
|
|
+ ofNullable(errorsAndWarnings.get(normalizedMessage)).map(p -> p.right() + 1).orElse(1)
|
|
|
+ )
|
|
|
+ );
|
|
|
}
|
|
|
} else {
|
|
|
// We combine multi line log messages to make sure we never break exceptions apart
|
|
@@ -996,10 +1006,10 @@ public class ElasticsearchNode implements TestClusterConfiguration {
|
|
|
}
|
|
|
if (errorsAndWarnings.isEmpty() == false) {
|
|
|
LOGGER.lifecycle("\n» ↓ errors and warnings from " + from + " ↓");
|
|
|
- errorsAndWarnings.forEach((message, count) -> {
|
|
|
- LOGGER.lifecycle("» " + message.replace("\n", "\n» "));
|
|
|
- if (count > 1) {
|
|
|
- LOGGER.lifecycle("» ↑ repeated " + count + " times ↑");
|
|
|
+ errorsAndWarnings.forEach((key, pair) -> {
|
|
|
+ LOGGER.lifecycle("» " + pair.left().replace("\n", "\n» "));
|
|
|
+ if (pair.right() > 1) {
|
|
|
+ LOGGER.lifecycle("» ↑ repeated " + pair.right() + " times ↑");
|
|
|
}
|
|
|
});
|
|
|
}
|