/* * Copyright 2014-2015 JKOOL, LLC. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.jkoolcloud.tnt4j.sink.impl.slf4j; import java.io.IOException; import java.util.Properties; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.jkoolcloud.tnt4j.core.Snapshot; import com.jkoolcloud.tnt4j.source.Source; import com.jkoolcloud.tnt4j.core.OpLevel; import com.jkoolcloud.tnt4j.format.EventFormatter; import com.jkoolcloud.tnt4j.sink.AbstractEventSink; import com.jkoolcloud.tnt4j.tracker.TrackingActivity; import com.jkoolcloud.tnt4j.tracker.TrackingEvent; import com.jkoolcloud.tnt4j.utils.Utils; /** * <p> * {@code EventSink} implementation that routes log messages to SLF4J. This implementation is designed to log * messages over SLF4J framework. * </p> * * * @see TrackingEvent * @see EventFormatter * @see AbstractEventSink * @see OpLevel * * @version $Revision: 11 $ * */ public class SLF4JEventSink extends AbstractEventSink { private Logger logger = null; /** * Create a new slf4j backed event sink * * @param name * slf4j event category/application name * @param props * java properties used by the event sink * @param frmt * event formatter used to format event entries * */ public SLF4JEventSink(String name, Properties props, EventFormatter frmt) { super(name, frmt); open(); } @Override protected void _log(TrackingEvent event) { switch (event.getSeverity()) { case HALT: case FATAL: case CRITICAL: case FAILURE: case ERROR: logger.error(getEventFormatter().format(event), event.getOperation().getThrowable()); break; case DEBUG: logger.debug(getEventFormatter().format(event), event.getOperation().getThrowable()); break; case INFO: case NONE: logger.info(getEventFormatter().format(event), event.getOperation().getThrowable()); break; case TRACE: logger.trace(getEventFormatter().format(event), event.getOperation().getThrowable()); break; case NOTICE: case WARNING: logger.warn(getEventFormatter().format(event), event.getOperation().getThrowable()); break; default: logger.info(getEventFormatter().format(event), event.getOperation().getThrowable()); break; } } @Override protected void _log(TrackingActivity activity) { Throwable ex = activity.getThrowable(); switch (activity.getSeverity()) { case HALT: case FATAL: case CRITICAL: case FAILURE: case ERROR: logger.error(getEventFormatter().format(activity), ex); break; case DEBUG: logger.debug(getEventFormatter().format(activity), ex); break; case INFO: case NONE: logger.info(getEventFormatter().format(activity), ex); break; case TRACE: logger.trace(getEventFormatter().format(activity), ex); break; case NOTICE: case WARNING: logger.warn(getEventFormatter().format(activity), ex); break; default: logger.info(getEventFormatter().format(activity), ex); break; } } @Override protected void _log(Snapshot snapshot) { switch (snapshot.getSeverity()) { case HALT: case FATAL: case CRITICAL: case FAILURE: case ERROR: logger.error(getEventFormatter().format(snapshot)); break; case DEBUG: logger.debug(getEventFormatter().format(snapshot)); break; case INFO: case NONE: logger.info(getEventFormatter().format(snapshot)); break; case TRACE: logger.trace(getEventFormatter().format(snapshot)); break; case NOTICE: case WARNING: logger.warn(getEventFormatter().format(snapshot)); break; default: logger.info(getEventFormatter().format(snapshot)); break; } } @Override protected void _log(long ttl, Source src, OpLevel sev, String msg, Object... args) { switch (sev) { case HALT: case FATAL: case CRITICAL: case FAILURE: case ERROR: logger.error(getEventFormatter().format(ttl, src, sev, msg, args), Utils.getThrowable(args)); break; case DEBUG: logger.debug(getEventFormatter().format(ttl, src, sev, msg, args), Utils.getThrowable(args)); break; case INFO: case NONE: logger.info(getEventFormatter().format(ttl, src, sev, msg, args), Utils.getThrowable(args)); break; case TRACE: logger.trace(getEventFormatter().format(ttl, src, sev, msg, args), Utils.getThrowable(args)); break; case NOTICE: case WARNING: logger.warn(getEventFormatter().format(ttl, src, sev, msg, args), Utils.getThrowable(args)); break; default: logger.info(getEventFormatter().format(ttl, src, sev, msg, args), Utils.getThrowable(args)); break; } } @Override public boolean isSet(OpLevel sev) { switch (sev) { case HALT: case FATAL: case CRITICAL: case FAILURE: case ERROR: return logger.isErrorEnabled(); case DEBUG: return logger.isDebugEnabled(); case INFO: case NONE: return logger.isInfoEnabled(); case TRACE: return logger.isTraceEnabled(); case NOTICE: case WARNING: return logger.isWarnEnabled(); default: return logger.isInfoEnabled(); } } @Override protected void _write(Object msg, Object... args) throws IOException { logger.info(getEventFormatter().format(msg, args)); } @Override public Object getSinkHandle() { return logger; } @Override public boolean isOpen() { return logger != null; } @Override public synchronized void open() { if (logger == null) { logger = LoggerFactory.getLogger(getName()); } } @Override public void close() throws IOException { } }