blob: fc9580653bdce5c5aace8f8c77c745209294526c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014, 2015 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Bernd Hufmann - Initial API and implementation
* Patrick Tasse - Move field declarations to trace
*******************************************************************************/
package org.eclipse.tracecompass.tmf.tests.stubs.trace.text;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.tracecompass.tmf.core.event.aspect.TmfBaseAspects;
import org.eclipse.tracecompass.tmf.core.event.aspect.ITmfEventAspect;
import org.eclipse.tracecompass.tmf.core.event.aspect.TmfContentFieldAspect;
import org.eclipse.tracecompass.tmf.core.timestamp.ITmfTimestamp;
import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimePreferences;
import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestampFormat;
import org.eclipse.tracecompass.tmf.core.trace.text.TextTrace;
import org.eclipse.tracecompass.tmf.core.trace.text.TextTraceEventContent;
import com.google.common.collect.ImmutableList;
/**
* Extension of TmfTrace for handling of system logs.
*/
public class SyslogTrace extends TextTrace<SyslogEvent> {
/** The cache size for system log traces. */
private static final int CACHE_SIZE = 100;
/** The time stamp format of the trace type. */
public static final String TIMESTAMP_FORMAT = "MMM dd HH:mm:ss"; //$NON-NLS-1$
/** The corresponding date format of the time stamp. */
public static final SimpleDateFormat TIMESTAMP_SIMPLEDATEFORMAT = new SimpleDateFormat(
TIMESTAMP_FORMAT, TmfTimePreferences.getLocale());
/** The regular expression pattern of the first line of an event. */
public static final Pattern LINE1_PATTERN = Pattern.compile(
"\\s*(\\S\\S\\S \\d\\d? \\d\\d:\\d\\d:\\d\\d)\\s*(\\S*)\\s*(\\S*):+\\s*(\\S*):([0-9]*)\\s*(.*\\S)?"); //$NON-NLS-1$
/* The current calendar to use */
private static final Calendar CURRENT = Calendar.getInstance();
/** The event fields */
@SuppressWarnings({"javadoc", "nls"})
public interface Field {
@NonNull String HOST = "Host";
@NonNull String LOGGER = "Logger";
@NonNull String FILE = "File";
@NonNull String LINE = "Line";
@NonNull String MESSAGE = "Message";
}
/** The event aspects */
public static final @NonNull Collection<ITmfEventAspect<?>> ASPECTS =
ImmutableList.of(
TmfBaseAspects.getTimestampAspect(),
new TmfContentFieldAspect(Field.HOST, Field.HOST),
new TmfContentFieldAspect(Field.LOGGER, Field.LOGGER),
new TmfContentFieldAspect(Field.FILE, Field.FILE),
new TmfContentFieldAspect(Field.LINE, Field.LINE),
new TmfContentFieldAspect(Field.MESSAGE, Field.MESSAGE)
);
/**
* Constructor
*/
public SyslogTrace() {
setCacheSize(CACHE_SIZE);
}
@Override
protected Pattern getFirstLinePattern() {
return LINE1_PATTERN;
}
@Override
protected SyslogEvent parseFirstLine(Matcher matcher, String line) {
ITmfTimestamp timestamp = null;
try {
synchronized (TIMESTAMP_SIMPLEDATEFORMAT) {
TIMESTAMP_SIMPLEDATEFORMAT.setTimeZone(TmfTimestampFormat.getDefaulTimeFormat().getTimeZone());
Date date = TIMESTAMP_SIMPLEDATEFORMAT.parse(matcher.group(1));
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(date);
calendar.set(Calendar.YEAR, CURRENT.get(Calendar.YEAR));
if (calendar.after(CURRENT)) {
calendar.set(Calendar.YEAR, CURRENT.get(Calendar.YEAR) - 1);
}
long ns = calendar.getTimeInMillis() * 1000000;
timestamp = createTimestamp(ns);
}
} catch (ParseException e) {
timestamp = TmfTimestamp.create(0, ITmfTimestamp.SECOND_SCALE);
}
TextTraceEventContent content = new TextTraceEventContent(5);
content.setValue(new StringBuffer(line));
content.addField(Field.HOST, matcher.group(2));
content.addField(Field.LOGGER, matcher.group(3));
content.addField(Field.FILE, matcher.group(4));
content.addField(Field.LINE, matcher.group(5));
content.addField(Field.MESSAGE, new StringBuffer(matcher.group(6) != null ? matcher.group(6) : "")); //$NON-NLS-1$
SyslogEvent event = new SyslogEvent(
this,
timestamp,
SyslogEventType.INSTANCE,
content); //$NON-NLS-1$
return event;
}
@Override
protected void parseNextLine(SyslogEvent event, String line) {
TextTraceEventContent content = event.getContent();
((StringBuffer) content.getValue()).append("\n").append(line); //$NON-NLS-1$
if (line.trim().length() > 0) {
((StringBuffer) content.getFieldValue(Field.MESSAGE)).append(SEPARATOR + line.trim());
}
}
@Override
public ITmfTimestamp getInitialRangeOffset() {
return TmfTimestamp.fromSeconds(60);
}
@Override
public Iterable<ITmfEventAspect<?>> getEventAspects() {
return ASPECTS;
}
}