package glug.parser; import glug.model.SignificantInterval; import glug.model.ThreadModel; import glug.model.time.LogInstant; import glug.parser.logmessages.LogMessageParser; import glug.parser.logmessages.LogMessageParserRegistry; import java.text.ParseException; import java.util.List; import java.util.regex.Matcher; public class LogLineParser { private static final String logStringJustUpToBeforeDash = "2009-02-25 00:00:00,022 [resin-tcp-connection-respub.gul3.gnl:6802-497] INFO com."; private static final int lengthOfLogStringJustUpToBeforeDash = logStringJustUpToBeforeDash.length(); private final LogMessageParserRegistry messageParserRegistry; private final LogCoordinateParser logCoordinateParser; public LogLineParser(LogCoordinateParser logCoordinateParser, LogMessageParserRegistry messageParserRegistry) { this.messageParserRegistry = messageParserRegistry; this.logCoordinateParser = logCoordinateParser; } /* * 2009-02-25 00:00:00,093 [resin-tcp-connection-respub.gul3.gnl:6802-39] * INFO com.gu.r2.common.diagnostic.database.PreparedStatementProxy * - Query "load com.gu.r2.common.model.page.LivePage" (component: slotMachineWithConstantHeading) completed in 20 ms */ /* 2009-02-25 00:00:05,534 [resin-tcp-connection-respub.gul3.gnl:6802-507] INFO com.gu.r2.common.webutil.RequestLoggingFilter - Request for /pages/Guardian/education/series/drwork/rss 2009-02-25 00:00:05,979 [resin-tcp-connection-respub.gul3.gnl:6802-197] INFO com.gu.r2.common.webutil.RequestLoggingFilter - Request for /pages/Guardian/world/rss completed in 5 ms */ public SignificantInterval parse(String line, int lineNumber) throws ParseException { int messageSplitIndex = line.indexOf(" - ", lengthOfLogStringJustUpToBeforeDash); if (logCoordinateParser.coordinateTextIsInvalid(line)) { return null; } if (messageSplitIndex==-1) { return null; } String loggerName = logCoordinateParser.getLoggerName(line, messageSplitIndex); List<LogMessageParser> messageParsersForLoggerName = messageParserRegistry.getMessageParsersFor(loggerName); if (messageParsersForLoggerName!=null) { String logMessage=line.substring(messageSplitIndex+3); for (LogMessageParser messageParser : messageParsersForLoggerName) { Matcher matcher = messageParser.getPattern().matcher(logMessage); if (matcher.matches()) { ThreadModel threadModel = logCoordinateParser.getThreadModel(line); LogInstant logInstant = new LogInstant(logCoordinateParser.getLogLineInstantInMillis(line),lineNumber); return messageParser.process(matcher, threadModel, logInstant); } } } return null; } }