package org.openstack.atlas.logs.hadoop.util; import org.openstack.atlas.util.staticutils.StaticDateTimeUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.openstack.atlas.exception.DateParseException; import org.openstack.atlas.exception.StringParseException; import org.openstack.atlas.logs.hadoop.writables.LogMapperOutputValue; import org.openstack.atlas.util.staticutils.StaticStringUtils; public final class LogChopper { private static final Log LOGGER = LogFactory.getLog(LogChopper.class); private static final Pattern LOG_PATTERN_1 = Pattern.compile("^(([^ ]++)\\s+([^ ]++)\\s+([^ ]++)\\s+([^ ]++)\\s+([^ ]++)\\s+\\[([^\\]]++)\\].*)$"); private static final Pattern LOG_PATTERN_2 = Pattern.compile("^(([^ ]++)\\s+([^ ]++)\\s+([^ ]++) ([^ ]++)\\s+\\[([^\\]]++)\\].*)$"); private static final Pattern LOG_PATTERN_3 = Pattern.compile("^(([^ ]++)\\s+([^ ]++)\\s+([^ ]++)\\s+\\[([^\\]]++)\\].*)$"); private static final Pattern LOG_PATTERN_4 = Pattern.compile("^(([^ ]++) ([^ ]++) \\[([^\\]]++)\\].*)$"); private static final Pattern LOG_PATTERN_5 = Pattern.compile("^(([^ ]++)\\s+\\[([^\\]]++)\\].*)$"); private static final Pattern LOG_PATTERN_6 = Pattern.compile("^(([^ ]++)\\s+[^\\[]+\\[([^\\]]++)\\].*)$"); private LogChopper() { } public static void getLogLineValues(String logLineIn, LogMapperOutputValue val) throws DateParseException, StringParseException { Matcher matcher; String date; String logLine; String lbName; logLine = StaticStringUtils.justOneCR(logLineIn); matcher = LOG_PATTERN_1.matcher(logLine); if (matcher.find()) { date = matcher.group(7); lbName = matcher.group(2); parseLogLine(logLine, lbName, true, date, null, val); return; } matcher = LOG_PATTERN_2.matcher(logLine); if (matcher.find()) { date = matcher.group(6); lbName = matcher.group(2); parseLogLine(logLine, lbName, true, date, null, val); return; } matcher = LOG_PATTERN_3.matcher(logLine); if (matcher.find()) { date = matcher.group(5); lbName = matcher.group(2); parseLogLine(logLine, lbName, true, date, null, val); return; } matcher = LOG_PATTERN_4.matcher(logLine); if (matcher.find()) { date = matcher.group(4); lbName = matcher.group(2); parseLogLine(logLine, lbName, true, date, null, val); return; } matcher = LOG_PATTERN_5.matcher(logLine); if (matcher.find()) { date = matcher.group(3); lbName = matcher.group(2); parseLogLine(logLine, lbName, true, date, null, val); return; } matcher = LOG_PATTERN_6.matcher(logLine); if (matcher.find()) { date = matcher.group(3); lbName = matcher.group(2); parseLogLine(logLine, lbName, true, date, null, val); return; } throw new StringParseException("Line did not match"); } private static void parseLogLine(String logline, String loadBalancerName, boolean matchFound, String date, String sourceIp, LogMapperOutputValue val) throws DateParseException, StringParseException { String[] arr; int accountId; int loadBalancerId; String accountId_loadBalancerId; try { arr = loadBalancerName.split("_"); accountId = Integer.parseInt(arr[0]); loadBalancerId = Integer.parseInt(arr[1]); accountId_loadBalancerId = accountId + "_" + loadBalancerId; } catch (Exception ex) { throw new StringParseException("Error could not decode accountId and loadbalancerId"); } if (loadBalancerName.contains("_S")) { try { logline = stripSSL(logline, loadBalancerName, accountId_loadBalancerId); } catch (Exception ex) { throw new StringParseException("Unable to convert _S lb to standard lb log line"); } } if (sourceIp == null) { sourceIp = ""; } val.setAccountId(accountId); val.setSourceIp(sourceIp); val.setLoadbalancerName(accountId_loadBalancerId); val.setLoadbalancerId(loadBalancerId); val.setLogLine(StaticStringUtils.justOneCR(logline)); // Not sure why the carriage returns were stripped. org.joda.time.DateTime dt; try { dt = StaticDateTimeUtils.parseApacheDateTime(date, true); } catch (Exception ex) { throw new DateParseException("Coulden't parse date"); } long dateOrd = StaticDateTimeUtils.dateTimeToOrdinalMillis(dt); val.setDate(dateOrd); return; } private static String stripSSL(String logline, String secureLoadBalancerName, String loadBalancerName) { String[] logSplit = logline.split(secureLoadBalancerName); String restOfLine = logSplit[1]; return loadBalancerName + restOfLine; } }