This is an automated email from the ASF dual-hosted git repository. prhomberg pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/geode.git
The following commit(s) were added to refs/heads/develop by this push: new 8ba2b34 GEODE-6100: Cleanup suspect string logic for better readability (#2920) 8ba2b34 is described below commit 8ba2b3442cc5c187bbd43df14c754e6d686eb2f1 Author: Patrick Rhomberg <prhomb...@pivotal.io> AuthorDate: Wed Dec 5 17:09:42 2018 -0800 GEODE-6100: Cleanup suspect string logic for better readability (#2920) --- .../geode/test/dunit/internal/DUnitLauncher.java | 41 +-- .../geode/test/greplogs/ExpectedStrings.java | 211 +++++++------ .../apache/geode/test/greplogs/LogConsumer.java | 349 ++++++++++++--------- 3 files changed, 308 insertions(+), 293 deletions(-) diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/DUnitLauncher.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/DUnitLauncher.java index 0303bc4..4ed724b 100644 --- a/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/DUnitLauncher.java +++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/DUnitLauncher.java @@ -32,7 +32,6 @@ import java.io.FileReader; import java.io.IOException; import java.lang.reflect.Method; import java.net.InetAddress; -import java.net.URISyntaxException; import java.nio.channels.FileChannel; import java.nio.charset.Charset; import java.rmi.AlreadyBoundException; @@ -41,6 +40,7 @@ import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.util.List; import java.util.Properties; +import java.util.regex.Pattern; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; @@ -127,7 +127,7 @@ public class DUnitLauncher { // TODO - this is hacky way to test for a hydra environment - see // if there is registered test configuration object. Class<?> clazz = Class.forName("hydra.TestConfig"); - Method getInstance = clazz.getMethod("getInstance", new Class[0]); + Method getInstance = clazz.getMethod("getInstance"); getInstance.invoke(null); return true; } catch (Exception e) { @@ -174,7 +174,7 @@ public class DUnitLauncher { return "localhost[" + locatorPort + "]"; } - private static void launch() throws URISyntaxException, AlreadyBoundException, IOException, + private static void launch() throws AlreadyBoundException, IOException, InterruptedException, NotBoundException { DUNIT_SUSPECT_FILE = new File(SUSPECT_FILENAME); DUNIT_SUSPECT_FILE.delete(); @@ -197,35 +197,7 @@ public class DUnitLauncher { // restrict membership ports to be outside of AvailablePort's range System.setProperty(DistributionConfig.RESTRICT_MEMBERSHIP_PORT_RANGE, "true"); - Runtime.getRuntime().addShutdownHook(new Thread() { - public void run() { - // System.out.println("shutting down DUnit JVMs"); - // for (int i=0; i<NUM_VMS; i++) { - // try { - // processManager.getStub(i).shutDownVM(); - // } catch (Exception e) { - // System.out.println("exception shutting down vm_"+i+": " + e); - // } - // } - // // TODO - hasLiveVMs always returns true - // System.out.print("waiting for JVMs to exit"); - // long giveUp = System.currentTimeMillis() + 5000; - // while (giveUp > System.currentTimeMillis()) { - // if (!processManager.hasLiveVMs()) { - // return; - // } - // System.out.print("."); - // System.out.flush(); - // try { - // Thread.sleep(1000); - // } catch (InterruptedException e) { - // break; - // } - // } - // System.out.println("\nkilling any remaining JVMs"); - processManager.killVMs(); - } - }); + Runtime.getRuntime().addShutdownHook(new Thread(processManager::killVMs)); // Create a VM for the locator processManager.launchVM(LOCATOR_VM_NUM); @@ -350,9 +322,8 @@ public class DUnitLauncher { public static void closeAndCheckForSuspects() { if (isLaunched()) { - final boolean skipLogMsgs = ExpectedStrings.skipLogMsgs("dunit"); - final List<?> expectedStrings = ExpectedStrings.create("dunit"); - final LogConsumer logConsumer = new LogConsumer(skipLogMsgs, expectedStrings, "log4j", 5); + final List<Pattern> expectedStrings = ExpectedStrings.create("dunit"); + final LogConsumer logConsumer = new LogConsumer(true, expectedStrings, "log4j", 5); final StringBuilder suspectStringBuilder = new StringBuilder(); diff --git a/geode-dunit/src/main/java/org/apache/geode/test/greplogs/ExpectedStrings.java b/geode-dunit/src/main/java/org/apache/geode/test/greplogs/ExpectedStrings.java index 325a1ea..68501d7 100644 --- a/geode-dunit/src/main/java/org/apache/geode/test/greplogs/ExpectedStrings.java +++ b/geode-dunit/src/main/java/org/apache/geode/test/greplogs/ExpectedStrings.java @@ -23,16 +23,12 @@ public class ExpectedStrings { private ExpectedStrings() {} public static boolean skipLogMsgs(String type) { - if (type.equals("junit") || type.equals("java") || type.equals("query") - || type.equals("dunit")) { - return true; - } else { - return false; - } + return type.equals("junit") || type.equals("java") || type.equals("query") + || type.equals("dunit"); } - public static List create(String type) { - List expected = new ArrayList(); + public static List<Pattern> create(String type) { + List<Pattern> expected = new ArrayList<>(); expected.add(Pattern.compile("@todo")); expected.add(Pattern.compile("Random seed")); @@ -65,7 +61,7 @@ public class ExpectedStrings { expected.add(Pattern.compile("Invoked MembershipNotifierHook")); expected.add(Pattern.compile("java.io.IOException: Connection reset by peer")); expected.add(Pattern.compile("client connections exceeds the licensed limit")); - // Exclude this since the only tests with securty enabled, expect to see + // Exclude this since the only tests with security enabled, expect to see // these and if they don't then the test fails expected.add(Pattern.compile("NotAuthorizedException")); expected.add(Pattern.compile("above critical heap threshold")); @@ -88,99 +84,110 @@ public class ExpectedStrings { // expected.add(Pattern.compile("Minimum system requirements not met. Unexpected behavior may // result in additional errors.")); - if (type.equals("junit") || type.equals("java") || type.equals("query")) { - expected.add(Pattern.compile("TEST EXCEPTION")); - expected.add(Pattern.compile("testLogLevels")); - expected.add(Pattern.compile("On iteration")); - expected.add(Pattern.compile("signal count")); - // Remove when davidw fixes - expected.add(Pattern.compile("Expected")); - // below here for gfx unit tests - expected.add(Pattern.compile("Valid documents must have a")); - expected.add(Pattern.compile("Loaded java.lang.ClassCastException")); - expected.add(Pattern.compile("Loaded java.io.InvalidClassException")); - expected.add(Pattern.compile("Loaded java.lang.NullPointerException")); - expected.add(Pattern.compile("Loaded java.lang.ArrayIndexOutOfBoundsException")); - expected.add(Pattern.compile("Loaded java.lang.IndexOutOfBoundsException")); - expected.add(Pattern.compile("SucessfulTest:")); - expected.add(Pattern.compile("SQLException: Database 'newDB' not found")); - expected.add(Pattern.compile("SQLException: Database 'newDB1' not found")); - expected.add(Pattern.compile("IGNORE_EXCEPTION_test")); - expected.add(Pattern.compile("Unsupported at this time")); - expected.add(Pattern.compile("DiskAccessException occurred as expected")); - expected.add(Pattern.compile("Oplog::createOplog:Exception in preblowing the file")); - } else if (type.equals("dunit")) { - expected.add(Pattern.compile("INCOMPATIBLE_ROOT")); - expected.add(Pattern.compile("connecting to locator")); - expected.add(Pattern.compile("ItsOkayForMyClassNotToBeFound")); - expected.add(Pattern.compile("Test Exception")); - expected.add(Pattern.compile("make sure exceptions from close callbacks")); - expected.add(Pattern.compile("Please ignore")); - expected.add(Pattern.compile("I have been thrown from TestFunction")); - expected.add(Pattern.compile("No admin on")); - expected.add(Pattern.compile("nonExistentMethod")); - expected.add(Pattern.compile("Expected exception")); - expected.add(Pattern.compile("ConnectionPoolTestNonSerializable")); - expected.add(Pattern.compile("One or more DUnit tests failed")); - expected.add(Pattern.compile("ReplyException")); - expected.add(Pattern.compile("fine 2")); - expected.add(Pattern.compile("TESTING A VERY UNIQUE")); - expected.add(Pattern.compile("-01-01")); - expected.add(Pattern.compile("testNBRegionDestructionDuringGetInitialImage")); - expected.add(Pattern.compile("SQLException: Database 'newDB' not found")); - expected.add(Pattern.compile("SQLException: Failed to start database 'newDB'")); - expected.add(Pattern.compile("SQLException: Database 'newDB1' not found")); - expected.add(Pattern.compile("INCORRECT_localhost")); - expected.add(Pattern.compile( - "WARNING: Failed to check connection: java.net.ConnectException: Connection refused")); - expected.add( - Pattern.compile("WARNING: Failed to call the method close..:java.rmi.ConnectException:")); - expected.add(Pattern.compile( - "WARNING: Failed to restart: java.rmi.NoSuchObjectException: no such object in table")); - expected.add(Pattern.compile( - "WARNING: Failed to restart: java.rmi.ConnectException: Connection refused to host: .* nested exception is:")); - expected.add(Pattern - .compile("UnitTests terminating abnormally after a client had a fatal task error")); - expected.add(Pattern.compile("Doing stack dump on all")); - expected.add(Pattern.compile("Unit test result: FAILED ==> Unsuccessfully ran JUnit tests")); - expected.add(Pattern.compile("IGNORE_EXCEPTION_test")); - expected.add(Pattern.compile("SIGQUIT received, dumping threads")); - expected.add(Pattern.compile("Sleeping \\d+ seconds between stack dumps")); - expected.add(Pattern.compile("Redundancy has dropped below")); - expected.add(Pattern.compile("Could not find any server to host redundant client")); - expected.add(Pattern.compile("Could not find any server to host primary client")); - expected.add(Pattern.compile("Could not find any server to create redundant client")); - expected.add(Pattern.compile("Could not find any server to create primary client")); - expected.add(Pattern.compile("Pool unexpected closed socket on server")); - expected.add(Pattern.compile("SocketTimeoutException")); - expected.add(Pattern.compile("Could not initialize a primary queue on startup")); - expected.add(Pattern.compile( - "java.lang.IllegalArgumentException: Sample timestamp must be greater than previous timestamp")); - // The following 2 strings are ignored due to bug 52042 - expected.add(Pattern.compile("failed accepting client connection")); - expected.add(Pattern.compile("Acceptor received unknown communication")); - } else if (type.equals("smoke")) { - expected.add(Pattern.compile("Doing stack dump on all")); - expected.add(Pattern.compile("SIGQUIT received, dumping threads")); - expected.add(Pattern.compile("Sleeping \\d+ seconds between stack dumps")); - expected.add(Pattern.compile("Could not find Spring Shell library")); - } else if (type.equals("perf")) { - expected.add(Pattern.compile("Doing stack dump on all")); - expected.add(Pattern.compile("SIGQUIT received, dumping threads")); - expected.add(Pattern.compile("Sleeping \\d+ seconds between stack dumps")); - } else if (type.equals("moresmoke")) { - expected.add(Pattern.compile(" expected error")); - expected.add(Pattern.compile("Doing stack dump on all")); - expected.add(Pattern.compile("SIGQUIT received, dumping threads")); - expected.add(Pattern.compile("Sleeping \\d+ seconds between stack dumps")); - } else { - expected.add(Pattern.compile("runbattery\\(\\) returned false")); - expected.add(Pattern.compile(" expected error")); - expected.add(Pattern.compile("Doing stack dump on all")); - expected.add(Pattern.compile("SIGQUIT received, dumping threads")); - expected.add(Pattern.compile("Sleeping \\d+ seconds between stack dumps")); - expected.add(Pattern.compile("HydraTask_initializeExpectException")); - expected.add(Pattern.compile("java.net.ConnectException: Connection refused")); + switch (type) { + case "junit": + case "java": + case "query": + expected.add(Pattern.compile("TEST EXCEPTION")); + expected.add(Pattern.compile("testLogLevels")); + expected.add(Pattern.compile("On iteration")); + expected.add(Pattern.compile("signal count")); + // Remove when davidw fixes + expected.add(Pattern.compile("Expected")); + // below here for gfx unit tests + expected.add(Pattern.compile("Valid documents must have a")); + expected.add(Pattern.compile("Loaded java.lang.ClassCastException")); + expected.add(Pattern.compile("Loaded java.io.InvalidClassException")); + expected.add(Pattern.compile("Loaded java.lang.NullPointerException")); + expected.add(Pattern.compile("Loaded java.lang.ArrayIndexOutOfBoundsException")); + expected.add(Pattern.compile("Loaded java.lang.IndexOutOfBoundsException")); + expected.add(Pattern.compile("SucessfulTest:")); + expected.add(Pattern.compile("SQLException: Database 'newDB' not found")); + expected.add(Pattern.compile("SQLException: Database 'newDB1' not found")); + expected.add(Pattern.compile("IGNORE_EXCEPTION_test")); + expected.add(Pattern.compile("Unsupported at this time")); + expected.add(Pattern.compile("DiskAccessException occurred as expected")); + expected.add(Pattern.compile("Oplog::createOplog:Exception in preblowing the file")); + break; + case "dunit": + expected.add(Pattern.compile("INCOMPATIBLE_ROOT")); + expected.add(Pattern.compile("connecting to locator")); + expected.add(Pattern.compile("ItsOkayForMyClassNotToBeFound")); + expected.add(Pattern.compile("Test Exception")); + expected.add(Pattern.compile("make sure exceptions from close callbacks")); + expected.add(Pattern.compile("Please ignore")); + expected.add(Pattern.compile("I have been thrown from TestFunction")); + expected.add(Pattern.compile("No admin on")); + expected.add(Pattern.compile("nonExistentMethod")); + expected.add(Pattern.compile("Expected exception")); + expected.add(Pattern.compile("ConnectionPoolTestNonSerializable")); + expected.add(Pattern.compile("One or more DUnit tests failed")); + expected.add(Pattern.compile("ReplyException")); + expected.add(Pattern.compile("fine 2")); + expected.add(Pattern.compile("TESTING A VERY UNIQUE")); + expected.add(Pattern.compile("-01-01")); + expected.add(Pattern.compile("testNBRegionDestructionDuringGetInitialImage")); + expected.add(Pattern.compile("SQLException: Database 'newDB' not found")); + expected.add(Pattern.compile("SQLException: Failed to start database 'newDB'")); + expected.add(Pattern.compile("SQLException: Database 'newDB1' not found")); + expected.add(Pattern.compile("INCORRECT_localhost")); + expected.add(Pattern.compile( + "WARNING: Failed to check connection: java.net.ConnectException: Connection refused")); + expected.add( + Pattern + .compile("WARNING: Failed to call the method close..:java.rmi.ConnectException:")); + expected.add(Pattern.compile( + "WARNING: Failed to restart: java.rmi.NoSuchObjectException: no such object in table")); + expected.add(Pattern.compile( + "WARNING: Failed to restart: java.rmi.ConnectException: Connection refused to host: .* nested exception is:")); + expected.add(Pattern + .compile("UnitTests terminating abnormally after a client had a fatal task error")); + expected.add(Pattern.compile("Doing stack dump on all")); + expected + .add(Pattern.compile("Unit test result: FAILED ==> Unsuccessfully ran JUnit tests")); + expected.add(Pattern.compile("IGNORE_EXCEPTION_test")); + expected.add(Pattern.compile("SIGQUIT received, dumping threads")); + expected.add(Pattern.compile("Sleeping \\d+ seconds between stack dumps")); + expected.add(Pattern.compile("Redundancy has dropped below")); + expected.add(Pattern.compile("Could not find any server to host redundant client")); + expected.add(Pattern.compile("Could not find any server to host primary client")); + expected.add(Pattern.compile("Could not find any server to create redundant client")); + expected.add(Pattern.compile("Could not find any server to create primary client")); + expected.add(Pattern.compile("Pool unexpected closed socket on server")); + expected.add(Pattern.compile("SocketTimeoutException")); + expected.add(Pattern.compile("Could not initialize a primary queue on startup")); + expected.add(Pattern.compile( + "java.lang.IllegalArgumentException: Sample timestamp must be greater than previous timestamp")); + // The following 2 strings are ignored due to bug 52042 + expected.add(Pattern.compile("failed accepting client connection")); + expected.add(Pattern.compile("Acceptor received unknown communication")); + break; + case "smoke": + expected.add(Pattern.compile("Doing stack dump on all")); + expected.add(Pattern.compile("SIGQUIT received, dumping threads")); + expected.add(Pattern.compile("Sleeping \\d+ seconds between stack dumps")); + expected.add(Pattern.compile("Could not find Spring Shell library")); + break; + case "perf": + expected.add(Pattern.compile("Doing stack dump on all")); + expected.add(Pattern.compile("SIGQUIT received, dumping threads")); + expected.add(Pattern.compile("Sleeping \\d+ seconds between stack dumps")); + break; + case "moresmoke": + expected.add(Pattern.compile(" expected error")); + expected.add(Pattern.compile("Doing stack dump on all")); + expected.add(Pattern.compile("SIGQUIT received, dumping threads")); + expected.add(Pattern.compile("Sleeping \\d+ seconds between stack dumps")); + break; + default: + expected.add(Pattern.compile("runbattery\\(\\) returned false")); + expected.add(Pattern.compile(" expected error")); + expected.add(Pattern.compile("Doing stack dump on all")); + expected.add(Pattern.compile("SIGQUIT received, dumping threads")); + expected.add(Pattern.compile("Sleeping \\d+ seconds between stack dumps")); + expected.add(Pattern.compile("HydraTask_initializeExpectException")); + expected.add(Pattern.compile("java.net.ConnectException: Connection refused")); + break; } return expected; } diff --git a/geode-dunit/src/main/java/org/apache/geode/test/greplogs/LogConsumer.java b/geode-dunit/src/main/java/org/apache/geode/test/greplogs/LogConsumer.java index c3e32e3..dd1ac42 100644 --- a/geode-dunit/src/main/java/org/apache/geode/test/greplogs/LogConsumer.java +++ b/geode-dunit/src/main/java/org/apache/geode/test/greplogs/LogConsumer.java @@ -21,7 +21,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; public class LogConsumer { - private final List expectedExceptions = new ArrayList(); + private final List<Pattern> expectedExceptions = new ArrayList<>(); private boolean skipLogMsgs = false; private boolean infoMsgFlag = false; private int eatLines = 0; @@ -29,11 +29,11 @@ public class LogConsumer { private int tmpErrLines = 0; private boolean saveFlag = false; private int savelinenum = 0; - private final List testExpectStrs; - StringBuilder all = null; + private final List<Pattern> testExpectStrs; + private StringBuilder all = null; private int lineNumber; private String fileName; - HashMap individalErrorCount = new HashMap(); + private HashMap<String, Integer> individualErrorCount = new HashMap<>(); private final int repeatLimit; private static final Pattern ExpectedExceptionPattern = @@ -68,7 +68,8 @@ public class LogConsumer { - public LogConsumer(boolean skipLogMsgs, List testExpectStrs, String fileName, int repeatLimit) { + public LogConsumer(boolean skipLogMsgs, List<Pattern> testExpectStrs, String fileName, + int repeatLimit) { super(); this.skipLogMsgs = skipLogMsgs; this.testExpectStrs = testExpectStrs; @@ -77,159 +78,204 @@ public class LogConsumer { } public StringBuilder consume(CharSequence line) { - { - lineNumber++; - Matcher m = ExpectedExceptionPattern.matcher(line); - if (m.find()) { - if (m.group(1).equals("add")) { - expectedExceptions.add(Pattern.compile(m.group(2))); - } else { - // assume add and remove are the only choices - expectedExceptions.remove(Pattern.compile(m.group(2))); - } - return null; - } + lineNumber++; + + // IgnoredException injects lines into the log to start or end ignore periods. + // Process those lines, then exit. + Matcher expectedExceptionMatcher = ExpectedExceptionPattern.matcher(line); + if (expectedExceptionMatcher.find()) { + expectedExceptionMatcherHandler(expectedExceptionMatcher); + return null; } - if (skipLogMsgs) { - if (infoMsgFlag) { - if (logPattern.matcher(line).find()) { - infoMsgFlag = false; - } else if (blankPattern.matcher(line).matches()) { - infoMsgFlag = false; - return null; - } else { - return null; - } - } - if (skipLevelPattern.matcher(line).find()) { - infoMsgFlag = true; - return null; - } + + // We may optionally skip info-level logs + if (skipLogMsgs && skipThisLogMsg(line)) { + return null; } + // In some case, we want to skip an extra line. if (eatLines != 0) { eatLines--; return null; - } else { - if (saveFlag || fatalOrErrorPattern.matcher(line).find()) { - if (!saveFlag) { - saveFlag = true; - tmpErrFlag = true; - if (checkExpectedStrs(line, expectedExceptions)) { - saveFlag = false; - tmpErrFlag = false; - tmpErrLines = 0; - } - if (tmpErrFlag) { - tmpErrLines = 1; - all = new StringBuilder(line); - all.append("\n"); - savelinenum = lineNumber; - } - } else { - if (causedByPattern.matcher(line).find()) { - // This code used to stop appending if a causedBy was seen. - // But we want the causedBy stack trace to also be included - // in the suspect StringBuilder. - // The main thing is we do not want to call checkExpectedStrs - // with this "caused by" line. - } else if (checkExpectedStrs(line, expectedExceptions)) { - // reset the counters and throw it all away if it matches - // one of the registered expected strings - tmpErrFlag = false; - tmpErrLines = 0; - saveFlag = false; - } - - // We save all the lines up to the next blank line so we're - // looking for a blank line here - if (blankPattern.matcher(line).matches()) { - // we found a blank line so print the suspect string - // and reset the savetag flag - saveFlag = false; - Matcher m = shortErrPattern.matcher(all.toString()); - if (m.matches()) { - String shortName = m.group(1); - Integer i = (Integer) individalErrorCount.get(shortName); - Integer occurances = new Integer((i == null) ? 1 : i.intValue() + 1); - individalErrorCount.put(shortName, occurances); - return enforceErrorLimit(occurances.intValue(), all.toString(), - // reader.getLineNumber(), - savelinenum, fileName); - - } else { - // error in determining shortName, wing it - return enforceErrorLimit(1, all.toString(), lineNumber, fileName); - } - } - - // we're still saving lines to append them on to all which contains - // all the lines we're trying to save - if (tmpErrFlag) { - if (tmpErrLines < ERROR_BUFFER_LIMIT) { - tmpErrLines++; - all.append(line).append("\n"); - } - if (tmpErrLines == ERROR_BUFFER_LIMIT) { - tmpErrLines++; // increment to prevent this line from repeating - all.append("GrepLogs: ERROR_BUFFER_LIMIT limit reached,") - .append(" the error was too long to display completely.\n"); - } - - } + } + + if (saveFlag || fatalOrErrorPattern.matcher(line).find()) { + if (!saveFlag) { + setInstanceVariablesForSomeReason(line); + } else { + if (!causedByPattern.matcher(line).find() && checkExpectedStrs(line, expectedExceptions)) { + // reset the counters and throw it all away if it matches + // one of the registered expected strings + tmpErrFlag = false; + tmpErrLines = 0; + saveFlag = false; } - // unique condition for when cache server see log exception and - // logging level is set to fine. Message looks like this: - // [fine 2005/10/25 17:53:13.586 PDT gemfire2 Server connection from - // hobbes.gemstone.com:34466-0xf4 nid=0x23e40f1] Server connection from - // hobbes.gemstone.com:34466: Wrote exception: - // org.apache.geode.cache.EntryNotFoundException: remote-destroy-key - // also now handles a JMX WARNING - } else if (wroteExceptionPattern.matcher(line).find() - || rmiWarnPattern.matcher(line).find()) { - // Eat only the single EntryNotFound Exception - eatLines = 1; - // if we are here then the line didn't have severe or error in it and - // didn't meet any special cases that require eating lines - // Check for other kinds of exceptions. This is by no means inclusive - // of all types of exceptions that could occur and some ARE missed. - } else if (exceptionPattern.matcher(line).find() || javaLangErrorPattern.matcher(line).find() - || (misformatedI18nMessagePattern.matcher(line).find() - && !(skipLevelPattern.matcher(line).find() - && rvvBitSetMessagePattern.matcher(line).find()))) { - if (!checkExpectedStrs(line, expectedExceptions)) { - // it's the Exception colon that we want to find - // along with the next six words and define to shortline - // shortline is only used for the unique sting to count the - // number of times an exception match occurs. This is so - // we can suppress further printing if we hit the limit - Matcher m2 = exceptionPattern2.matcher(line); - Matcher m3 = exceptionPattern3.matcher(line); - Matcher m4 = exceptionPattern4.matcher(line); - String shortName = null; - - if (m2.find()) { - shortName = m2.group(1); - } else if (m3.find()) { - shortName = m3.group(1); - } else if (m4.find()) { - shortName = m4.group(1); - } - if (shortName != null) { - Integer i = (Integer) individalErrorCount.get(shortName); - Integer occurances = new Integer((i == null) ? 1 : i.intValue() + 1); - individalErrorCount.put(shortName, occurances); - return enforceErrorLimit(occurances.intValue(), line + "\n", lineNumber, fileName); - } else { - return enforceErrorLimit(1, line + "\n", lineNumber, fileName); - } + + // We save all the lines up to the next blank line so we're + // looking for a blank line here + if (blankPattern.matcher(line).matches()) { + return enforceErrorLimitsAtShortErrMatcher(); } + + // we're still saving lines to append them on to all which contains + // all the lines we're trying to save + if (tmpErrFlag) { + addErrLinesToAll(line); + } + } + } else if (isWroteOrRMIWarn(line)) { + handleWroteOrRMIWarn(); + return null; + } else if (isExceptionErrorOrSomeSpecialCase(line)) { + if (!checkExpectedStrs(line, expectedExceptions)) { + return enforceErrorLimitOnShortName(line); } } return null; } + private void handleWroteOrRMIWarn() { + // unique condition for when cache server see log exception and + // logging level is set to fine. Message looks like this: + // [fine 2005/10/25 17:53:13.586 PDT gemfire2 Server connection from + // hobbes.gemstone.com:34466-0xf4 nid=0x23e40f1] Server connection from + // hobbes.gemstone.com:34466: Wrote exception: + // org.apache.geode.cache.EntryNotFoundException: remote-destroy-key + // also now handles a JMX WARNING + + // if we are here then the line didn't have severe or error in it and + // didn't meet any special cases that require eating lines + // Check for other kinds of exceptions. This is by no means inclusive + // of all types of exceptions that could occur and some ARE missed. + + // Eat only the single EntryNotFound Exception + eatLines = 1; + } + + private boolean isWroteOrRMIWarn(CharSequence line) { + return wroteExceptionPattern.matcher(line).find() || rmiWarnPattern.matcher(line).find(); + } + + private StringBuilder enforceErrorLimitOnShortName(CharSequence line) { + // it's the Exception colon that we want to find + // along with the next six words and define to shortline + // shortline is only used for the unique sting to count the + // number of times an exception match occurs. This is so + // we can suppress further printing if we hit the limit + String shortName = getShortName(line); + if (shortName != null) { + Integer i = individualErrorCount.get(shortName); + int occurrences = (i == null) ? 1 : i + 1; + individualErrorCount.put(shortName, occurrences); + return enforceErrorLimit(occurrences, line + "\n", lineNumber, fileName); + } else { + return enforceErrorLimit(1, line + "\n", lineNumber, fileName); + } + } + + private boolean isExceptionErrorOrSomeSpecialCase(CharSequence line) { + return exceptionPattern.matcher(line).find() + || javaLangErrorPattern.matcher(line).find() + || (misformatedI18nMessagePattern.matcher(line).find() + && !(skipLevelPattern.matcher(line).find() + && rvvBitSetMessagePattern.matcher(line).find())); + } + + private void addErrLinesToAll(CharSequence line) { + if (tmpErrLines < ERROR_BUFFER_LIMIT) { + tmpErrLines++; + all.append(line).append("\n"); + } + if (tmpErrLines == ERROR_BUFFER_LIMIT) { + tmpErrLines++; // increment to prevent this line from repeating + all.append("GrepLogs: ERROR_BUFFER_LIMIT limit reached,") + .append(" the error was too long to display completely.\n"); + } + } + + private StringBuilder enforceErrorLimitsAtShortErrMatcher() { + // we found a blank line so print the suspect string and reset the savetag flag + saveFlag = false; + Matcher shortErrMatcher = shortErrPattern.matcher(all.toString()); + if (shortErrMatcher.matches()) { + String shortName = shortErrMatcher.group(1); + Integer i = individualErrorCount.get(shortName); + int occurrences = (i == null) ? 1 : i + 1; + individualErrorCount.put(shortName, occurrences); + return enforceErrorLimit(occurrences, all.toString(), savelinenum, fileName); + + } else { + // error in determining shortName, wing it + return enforceErrorLimit(1, all.toString(), lineNumber, fileName); + } + } + + private void setInstanceVariablesForSomeReason(CharSequence line) { + saveFlag = true; + tmpErrFlag = true; + if (checkExpectedStrs(line, expectedExceptions)) { + saveFlag = false; + tmpErrFlag = false; + tmpErrLines = 0; + } + if (tmpErrFlag) { + tmpErrLines = 1; + all = new StringBuilder(line); + all.append("\n"); + savelinenum = lineNumber; + } + } + + private String getShortName(CharSequence line) { + Matcher m2 = exceptionPattern2.matcher(line); + if (m2.find()) { + return m2.group(1); + } + + Matcher m3 = exceptionPattern3.matcher(line); + if (m3.find()) { + return m3.group(1); + } + + Matcher m4 = exceptionPattern4.matcher(line); + if (m4.find()) { + return m4.group(1); + } + + return null; + } + + /** This method returns true if this line should be skipped. */ + private boolean skipThisLogMsg(CharSequence line) { + if (infoMsgFlag) { + if (logPattern.matcher(line).find()) { + infoMsgFlag = false; + } else if (blankPattern.matcher(line).matches()) { + infoMsgFlag = false; + return true; + } else { + return true; + } + } + + if (skipLevelPattern.matcher(line).find()) { + infoMsgFlag = true; + return true; + } + + return false; + } + + private void expectedExceptionMatcherHandler(Matcher expectedExceptionMatcher) { + if (expectedExceptionMatcher.group(1).equals("add")) { + expectedExceptions.add(Pattern.compile(expectedExceptionMatcher.group(2))); + } else { + // assume add and remove are the only choices + expectedExceptions.remove(Pattern.compile(expectedExceptionMatcher.group(2))); + } + } + public StringBuilder close() { if (saveFlag) { // Bug fix for severe that occurs at the end of a log file. Since we @@ -243,18 +289,9 @@ public class LogConsumer { return null; } - private boolean checkExpectedStrs(CharSequence line, List expectedExceptions) { - for (int i = 0; i < expectedExceptions.size(); i++) { - Pattern p = (Pattern) expectedExceptions.get(i); - if (p.matcher(line).find()) - return true; - } - for (int i = 0; i < testExpectStrs.size(); i++) { - Pattern p = (Pattern) testExpectStrs.get(i); - if (p.matcher(line).find()) - return true; - } - return false; + private boolean checkExpectedStrs(CharSequence line, List<Pattern> expectedExceptions) { + return expectedExceptions.stream().anyMatch(expected -> expected.matcher(line).find()) + || testExpectStrs.stream().anyMatch(testExpected -> testExpected.matcher(line).find()); } private StringBuilder enforceErrorLimit(int hits, String line, int linenum, String filename) {