package org.araqne.logparser.krsyslog.nexg; import java.util.HashMap; import java.util.Map; import org.araqne.log.api.V1LogParser; public class NexgFwParser extends V1LogParser { private final org.slf4j.Logger slog = org.slf4j.LoggerFactory.getLogger(NexgFwParser.class); @Override public Map<String, Object> parse(Map<String, Object> params) { String line = (String) params.get("line"); if (line == null) return params; try { Map<String, Object> m = new HashMap<String, Object>(); StringBuilder builder = new StringBuilder(line); int b = 0; int e = 19; String dateTime = builder.substring(b, e); m.put("DATETIME", dateTime); b = e + 1; e = line.indexOf(":", b); String logCategory = builder.substring(b, e); m.put("LOG_CATEGORY", logCategory); b = e + 2; String delimiter = "="; while (b != -1 && (e = builder.indexOf(delimiter, b)) > 0) { String key = builder.substring(b, e); if (key.equals("MISC")) { b = e + 2; int boundary = builder.indexOf("'", b); while ((b != -1 && (e = builder.indexOf(delimiter, b)) > 0)) { if (e >= boundary) { b = boundary + 2; break; } key = builder.substring(b, e); b = parseKeyValue(m, builder, b, e, key); } } else { // single quote & double quote b = parseKeyValue(m, builder, b, e, key); } } return m; } catch (Throwable t) { if (slog.isDebugEnabled()) slog.debug("araqne log api: cannot parse hansol fw format - line [{}]", line); return params; } } private int parseKeyValue(Map<String, Object> m, StringBuilder builder, int b, int e, String key) { char valueFirstChar = builder.charAt(e + 1); if (valueFirstChar == '"' || valueFirstChar == '\'') { String value = ""; int i = e + 2; while (true) { char ch = builder.charAt(i); if (ch == valueFirstChar) { try { value = builder.substring(e + 2, i); break; } catch (IndexOutOfBoundsException ex) { value = builder.substring(e + 2, i); break; } } i++; } m.put(key, value); b = i + 2; } else { // the others int endPos = builder.indexOf(" ", e + 1); String value; if (endPos == -1) { value = builder.substring(e + 1); m.put(key, value); return -1; } else { value = builder.substring(e + 1, endPos); m.put(key, value); b = endPos + 1; } } return b; } }