/* * Copyright: Almende B.V. (2014), Rotterdam, The Netherlands * License: The Apache Software License, Version 2.0 */ package com.almende.eve.protocol; import java.io.IOException; import java.util.logging.FileHandler; import java.util.logging.Formatter; import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.Logger; import com.almende.eve.capabilities.handler.Handler; import com.almende.util.jackson.JOM; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.node.ObjectNode; /** * The Class InboxProtocol, provides an easy way to get a single threaded agent, * only one inbound message in a single thread at a time. */ public class TraceProtocol implements Protocol { private static final Logger LOG = Logger.getLogger(TraceProtocol.class .getName()); private TraceProtocolConfig params = null; private Logger logger = null; private FileHandler handler = null; /** * Instantiates a new protocol tracer. * * @param params * the params * @param handle * the handle */ public TraceProtocol(final ObjectNode params, final Handler<Object> handle) { this.params = TraceProtocolConfig.decorate(params); this.logger = Logger.getLogger("TraceProtocol_" + this.params.getId()); this.logger.setLevel(Level.ALL); if (this.params.getFileName() != null) { String filename = this.params.getFileName() + this.params.getId(); try { handler = new FileHandler(filename); this.logger.addHandler(handler); if (this.params.isFlat()) { handler.setFormatter(new MyFormatter()); } LOG.warning("Started tracelog:"+filename); } catch (IOException e) { LOG.log(Level.WARNING, "Couldn't open outputfile for tracing:" + filename, e); } } } @Override public ObjectNode getParams() { return this.params; } @Override public void delete() { if (handler != null) { this.logger.removeHandler(handler); handler.flush(); handler.close(); handler = null; } } private void log(final Meta msg, final boolean inbound) { try { logger.fine((inbound ? "IN :" : "OUT:") + JOM.getInstance().writeValueAsString(msg)); } catch (JsonProcessingException e) { LOG.log(Level.WARNING, "Couldn't serialize tracemessage", e); } } @Override public boolean inbound(Meta msg) { log(msg, true); // just forwarding... return msg.nextIn(); } @Override public boolean outbound(Meta msg) { log(msg, false); // just forwarding... return msg.nextOut(); } class MyFormatter extends Formatter { /** * Format the given LogRecord. * * @param record * the log record to be formatted. * @return a formatted log record */ public synchronized String format(LogRecord record) { StringBuilder sb = new StringBuilder(); sb.append(record.getMillis()); sb.append(":"); sb.append(record.getLoggerName()); sb.append(":"); sb.append(record.getThreadID()); sb.append(":"); sb.append(record.getMessage()); sb.append("\n"); return sb.toString(); } } }