/* * Copyright (c) 2014 EMC Corporation * All Rights Reserved */ package com.emc.storageos.systemservices.impl.logsvc.parse; import com.emc.storageos.systemservices.impl.logsvc.LogMessage; import com.emc.vipr.model.sys.logging.LogRequest; import com.emc.vipr.model.sys.logging.LogSeverity; /** * Parse syslog line to LogMessage * * @author siy * */ public class LogSyslogParser extends LogParser { private final int TIME_LENGTH = 21; /** * Parse line from file to LogMessage If line does not match log format(it * is the message part for multiple lines log), return * LogMessage.CONTINUATION_LOGMESSAGE; if line matches log formant, time is * too late for time filter, return LogMessage.REJECTED_LAST_LOGMESSAGE if * line matches log formant, but does not match all filters, return * LogMessage.REJECTED_LOGMESSAGE; if line matches log formant and all * filters, return LogMessage object */ @Override public LogMessage parseLine(String line, LogRequest info) { // length of the time 2013-11-20 13:56:48 [ int lineLength = line.length(); if (lineLength <= TIME_LENGTH || line.charAt(4) != '-' || line.charAt(7) != '-' || line.charAt(10) != ' ' || line.charAt(13) != ':' || line.charAt(16) != ':' || line.charAt(19) != ' ' || line.charAt(20) != '[') { return LogMessage.CONTINUATION_LOGMESSAGE; } String yearStr = line.substring(0, 4); int year = toNumber(yearStr); if (year < 0) { return LogMessage.CONTINUATION_LOGMESSAGE; } String monthStr = line.substring(5, 7); int month = toNumber(monthStr); if (month < 0) { return LogMessage.CONTINUATION_LOGMESSAGE; } String dayStr = line.substring(8, 10); int day = toNumber(dayStr); if (day < 0) { return LogMessage.CONTINUATION_LOGMESSAGE; } String hourStr = line.substring(11, 13); int hour = toNumber(hourStr); if (hour < 0) { return LogMessage.CONTINUATION_LOGMESSAGE; } String minStr = line.substring(14, 16); int min = toNumber(minStr); if (min < 0) { return LogMessage.CONTINUATION_LOGMESSAGE; } String secStr = line.substring(17, 19); int sec = toNumber(secStr); if (sec < 0) { return LogMessage.CONTINUATION_LOGMESSAGE; } String timeStr = line.substring(0, TIME_LENGTH - 2); final int endBracket = line.indexOf("]", TIME_LENGTH); if (endBracket < 0 || endBracket - TIME_LENGTH > Short.MAX_VALUE) { return LogMessage.CONTINUATION_LOGMESSAGE; } final int priorityStartIndex = endBracket + 2; // endBracket + 1 is // white space if (priorityStartIndex > lineLength || priorityStartIndex > Short.MAX_VALUE) { return LogMessage.CONTINUATION_LOGMESSAGE; } final int priorityEndIndex = line.indexOf(" ", priorityStartIndex); if (priorityEndIndex + 1 > lineLength || priorityEndIndex + 1 > Short.MAX_VALUE || priorityEndIndex - priorityStartIndex > Short.MAX_VALUE) { return LogMessage.CONTINUATION_LOGMESSAGE; } // test time filter int inTime = inTimeRange(year, month, day, hour, min, sec, 0, info); if (inTime < 0) { // too early return LogMessage.REJECTED_LOGMESSAGE; } else if (inTime > 0) { // too late return LogMessage.REJECTED_LAST_LOGMESSAGE; } final String priority = line.substring(priorityStartIndex, priorityEndIndex); final int level = LogSeverity.toLevel(priority); if (level < 0) { return LogMessage.CONTINUATION_LOGMESSAGE; } int matchLevel = matchLevelFilter(level, info); if (matchLevel > 0) { // level value bigger then request return LogMessage.REJECTED_LOGMESSAGE; } LogMessage log = new LogMessage(getTime(year, month, day, hour, min, sec, 0), line.getBytes()); log.setLogOffset(priorityEndIndex + 1); log.setTimeBytes(0, TIME_LENGTH - 2); log.setThreadName(TIME_LENGTH, endBracket - TIME_LENGTH); log.setLevel(level); return log; } }