package dmg.cells.nucleus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.dcache.util.NetLoggerBuilder;
/**
* Implements cell event logging following the NetLogger format.
*
* The log format was originally documented as a CEDPS best practice recommendation,
* however CEDPS no longer exists. A more current description of the format can
* be found at https://docs.google.com/document/d/1oeW_l_YgQbR-C_7R2cKl6eYBT5N4WSMbvz0AT6hYDvA
*
* The NetLogger project can be found at http://netlogger.lbl.gov
*/
public class EventLogger
{
private static final Logger deliver =
LoggerFactory.getLogger("org.dcache.events.cells.deliver");
private static final Logger send =
LoggerFactory.getLogger("org.dcache.events.cells.send");
private static final Logger queue =
LoggerFactory.getLogger("org.dcache.events.cells.queue");
private static final Logger lifecycle =
LoggerFactory.getLogger("org.dcache.events.cells.lifecycle");
/* Message events */
private static final String DELIVER_BEGIN =
"org.dcache.cells.deliver.begin";
private static final String DELIVER_END =
"org.dcache.cells.deliver.end";
private static final String SEND_BEGIN =
"org.dcache.cells.send.begin";
private static final String SEND_END =
"org.dcache.cells.send.end";
private static final String QUEUE_BEGIN =
"org.dcache.cells.queue.begin";
private static final String QUEUE_END =
"org.dcache.cells.queue.end";
/* Cell lifecycle events */
private static final String PREPARE_SETUP_BEGIN =
"org.dcache.cells.lifecycle.prepare-setup.begin";
private static final String PREPARE_SETUP_END =
"org.dcache.cells.lifecycle.prepare-setup.end";
private static final String POST_SETUP_BEGIN =
"org.dcache.cells.lifecycle.post-setup.begin";
private static final String POST_SETUP_END =
"org.dcache.cells.lifecycle.post-setup.end";
private static final String PREPARE_REMOVAL_BEGIN =
"org.dcache.cells.lifecycle.prepare-removal.begin";
private static final String PREPARE_REMOVAL_END =
"org.dcache.cells.lifecycle.prepare-removal.end";
private static final String POST_REMOVAL_BEGIN =
"org.dcache.cells.lifecycle.post-removal.begin";
private static final String POST_REMOVAL_END =
"org.dcache.cells.lifecycle.post-removal.end";
/* AbstractCell lifecycle events */
private static final String STARTING_BEGIN =
"org.dcache.cells.lifecycle.starting.begin";
private static final String STARTING_END =
"org.dcache.cells.lifecycle.starting.end";
private static final String STARTED_BEGIN =
"org.dcache.cells.lifecycle.started.begin";
private static final String STARTED_END =
"org.dcache.cells.lifecycle.started.end";
private static final String STOPPING_BEGIN =
"org.dcache.cells.lifecycle.stopping.begin";
private static final String STOPPING_END =
"org.dcache.cells.lifecycle.stopping.end";
private static final String STOPPED_BEGIN =
"org.dcache.cells.lifecycle.stopped.begin";
private static final String STOPPED_END =
"org.dcache.cells.lifecycle.stopped.end";
public static void prepareSetupBegin(Cell cell, StartEvent event)
{
if (lifecycle.isInfoEnabled()) {
NetLoggerBuilder log = new NetLoggerBuilder(PREPARE_SETUP_BEGIN);
log.add("cell", ((CellPath)event.getSource()).getCurrent().getCellName());
log.add("class", cell.getClass().getCanonicalName());
log.add("timeout", event.getTimeout());
lifecycle.info(log.toString());
}
}
public static void prepareSetupEnd(Cell cell, StartEvent event)
{
if (lifecycle.isInfoEnabled()) {
NetLoggerBuilder log = new NetLoggerBuilder(PREPARE_SETUP_END);
log.add("cell", ((CellPath)event.getSource()).getCurrent().getCellName());
log.add("class", cell.getClass().getCanonicalName());
log.add("timeout", event.getTimeout());
lifecycle.info(log.toString());
}
}
public static void postStartupBegin(Cell cell, StartEvent event)
{
if (lifecycle.isInfoEnabled()) {
NetLoggerBuilder log = new NetLoggerBuilder(POST_SETUP_BEGIN);
log.add("cell", ((CellPath)event.getSource()).getCurrent().getCellName());
log.add("class", cell.getClass().getCanonicalName());
log.add("timeout", event.getTimeout());
lifecycle.info(log.toString());
}
}
public static void postStartupEnd(Cell cell, StartEvent event)
{
if (lifecycle.isInfoEnabled()) {
NetLoggerBuilder log = new NetLoggerBuilder(POST_SETUP_END);
log.add("cell", ((CellPath)event.getSource()).getCurrent().getCellName());
log.add("class", cell.getClass().getCanonicalName());
log.add("timeout", event.getTimeout());
lifecycle.info(log.toString());
}
}
public static void prepareRemovalBegin(Cell cell, KillEvent event)
{
if (lifecycle.isInfoEnabled()) {
NetLoggerBuilder log = new NetLoggerBuilder(PREPARE_REMOVAL_BEGIN);
log.add("cell", event.getTarget());
log.add("class", cell.getClass().getCanonicalName());
log.add("killer", ((CellPath)event.getSource()).getCurrent().getCellName());
lifecycle.info(log.toString());
}
}
public static void prepareRemovalEnd(Cell cell, KillEvent event)
{
if (lifecycle.isInfoEnabled()) {
NetLoggerBuilder log = new NetLoggerBuilder(PREPARE_REMOVAL_END);
log.add("cell", event.getTarget());
log.add("class", cell.getClass().getCanonicalName());
log.add("killer", ((CellPath)event.getSource()).getCurrent().getCellName());
lifecycle.info(log.toString());
}
}
public static void postRemovalBegin(Cell cell, KillEvent event)
{
if (lifecycle.isInfoEnabled()) {
NetLoggerBuilder log = new NetLoggerBuilder(POST_REMOVAL_BEGIN);
log.add("cell", event.getTarget());
log.add("class", cell.getClass().getCanonicalName());
log.add("killer", ((CellPath)event.getSource()).getCurrent().getCellName());
lifecycle.info(log.toString());
}
}
public static void postRemovalEnd(Cell cell, KillEvent event)
{
if (lifecycle.isInfoEnabled()) {
NetLoggerBuilder log = new NetLoggerBuilder(POST_REMOVAL_END);
log.add("cell", event.getTarget());
log.add("class", cell.getClass().getCanonicalName());
log.add("killer", ((CellPath)event.getSource()).getCurrent().getCellName());
lifecycle.info(log.toString());
}
}
public static void startingBegin(String cell)
{
if (lifecycle.isInfoEnabled()) {
NetLoggerBuilder log = new NetLoggerBuilder(STARTING_BEGIN);
log.add("cell", cell);
lifecycle.info(log.toString());
}
}
public static void startingEnd(String cell)
{
if (lifecycle.isInfoEnabled()) {
NetLoggerBuilder log = new NetLoggerBuilder(STARTING_END);
log.add("cell", cell);
lifecycle.info(log.toString());
}
}
public static void startedBegin(String cell)
{
if (lifecycle.isInfoEnabled()) {
NetLoggerBuilder log = new NetLoggerBuilder(STARTED_BEGIN);
log.add("cell", cell);
lifecycle.info(log.toString());
}
}
public static void startedEnd(String cell)
{
if (lifecycle.isInfoEnabled()) {
NetLoggerBuilder log = new NetLoggerBuilder(STARTED_END);
log.add("cell", cell);
lifecycle.info(log.toString());
}
}
public static void stoppingBegin(String cell)
{
if (lifecycle.isInfoEnabled()) {
NetLoggerBuilder log = new NetLoggerBuilder(STOPPING_BEGIN);
log.add("cell", cell);
lifecycle.info(log.toString());
}
}
public static void stoppingEnd(String cell)
{
if (lifecycle.isInfoEnabled()) {
NetLoggerBuilder log = new NetLoggerBuilder(STOPPING_END);
log.add("cell", cell);
lifecycle.info(log.toString());
}
}
public static void stoppedBegin(String cell)
{
if (lifecycle.isInfoEnabled()) {
NetLoggerBuilder log = new NetLoggerBuilder(STOPPED_BEGIN);
log.add("cell", cell);
lifecycle.info(log.toString());
}
}
public static void stoppedEnd(String cell)
{
if (lifecycle.isInfoEnabled()) {
NetLoggerBuilder log = new NetLoggerBuilder(STOPPED_END);
log.add("cell", cell);
lifecycle.info(log.toString());
}
}
private static String getMessage(CellMessage envelope)
{
Object o = envelope.getMessageObject();
if (o == null) {
return "";
} else if (o instanceof String) {
return o.toString();
} else {
return o.getClass().getSimpleName();
}
}
public static void deliverBegin(CellMessage envelope)
{
if (deliver.isInfoEnabled()) {
NetLoggerBuilder log = new NetLoggerBuilder(DELIVER_BEGIN);
log.add("uoid", envelope.getUOID());
log.add("lastuoid", envelope.getLastUOID());
log.add("session", envelope.getSession());
log.add("message", getMessage(envelope));
log.add("source", envelope.getSourcePath());
log.add("destination", envelope.getDestinationPath());
deliver.info(log.toString());
}
}
public static void deliverEnd(Object session, UOID uoid)
{
if (deliver.isInfoEnabled()) {
NetLoggerBuilder log = new NetLoggerBuilder(DELIVER_END);
log.add("uoid", uoid);
log.add("session", session);
deliver.info(log.toString());
}
}
public static void sendBegin(CellMessage envelope, String mode)
{
if (send.isInfoEnabled() && !envelope.isStreamMode()) {
CellPath source = envelope.getSourcePath();
NetLoggerBuilder log = new NetLoggerBuilder(SEND_BEGIN);
log.add("uoid", envelope.getUOID());
log.add("lastuoid", envelope.getLastUOID());
log.add("session", envelope.getSession());
log.add("mode", mode);
log.add("message", getMessage(envelope));
log.add("source", source);
log.add("destination", envelope.getDestinationPath());
send.info(log.toString());
}
}
public static void sendEnd(CellMessage envelope)
{
if (send.isInfoEnabled() && !envelope.isStreamMode()) {
NetLoggerBuilder log = new NetLoggerBuilder(SEND_END);
log.add("uoid", envelope.getUOID());
log.add("session", envelope.getSession());
send.info(log.toString());
}
}
public static void queueBegin(CellEvent event)
{
if (queue.isInfoEnabled() && event.getClass().equals(MessageEvent.class)) {
CellMessage envelope = ((MessageEvent) event).getMessage();
NetLoggerBuilder log = new NetLoggerBuilder(QUEUE_BEGIN);
log.add("uoid", envelope.getUOID());
log.add("lastuoid", envelope.getLastUOID());
log.add("session", envelope.getSession());
log.add("source", envelope.getSourcePath());
log.add("destination", envelope.getDestinationPath());
queue.info(log.toString());
}
}
public static void queueEnd(CellEvent event)
{
if (queue.isInfoEnabled() && event.getClass().equals(MessageEvent.class)) {
CellMessage envelope = ((MessageEvent) event).getMessage();
NetLoggerBuilder log = new NetLoggerBuilder(QUEUE_END);
log.add("uoid", envelope.getUOID());
log.add("session", envelope.getSession());
queue.info(log.toString());
}
}
}