package org.sef4j.core.api.logger;
import java.util.Collection;
import org.sef4j.core.api.EventSender;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* similar to slf4j org.slf4j.Logger, but for events ...
* <p/>
*
* this class is owned by eventLoggerFactory : life-cycle start()/stop() is managed by owner,
* instances are re-configured if context change, but instance are never "disposed" once used.<BR/>
*
*
* When choosing to use the default StaticBinder singleton, it is safe to use code like this:
* <code>
* public static final EventLogger EVENT_LOGGER = EventLogger.getStatic(..);
* // .. which is simply an alias for EventLoggerFactoryStaticBinder.getInstance().getEventLogger(..);
* </code>
* because EventLogger are still "owned" by the default static EventLoggerFactory, and may be reconfigured at runtime with new appenders
*
*/
public final class EventLogger implements EventSender<Object> {
private final Logger LOG;
private final EventLoggerFactory eventLoggerFactory;
private final String eventLoggerName;
/**
* copy-on-write array of inherited appenders (from parent EventLogger + own appender)
* this is managed from class EventLoggerContext, from configuration(at startup / re-init of context)
*/
private EventSender<Object>[] inheritedAppenders;
// ------------------------------------------------------------------------
/* package protected, created and managed from EventLoggerContext */
/* pp */ EventLogger(EventLoggerFactory eventLoggerFactory, String eventLoggerName, EventSender<Object>[] inheritedAppenders) {
this.eventLoggerFactory = eventLoggerFactory;
this.eventLoggerName = eventLoggerName;
this.LOG = LoggerFactory.getLogger(eventLoggerName);
this.inheritedAppenders = inheritedAppenders;
}
public static EventLogger getStatic(String eventLoggerName) {
return EventLoggerFactoryStaticBinder.getInstance().getEventLogger(eventLoggerName);
}
public static EventLogger getStatic(Class<?> clss) {
return getStatic(clss.getName());
}
/*pp*/ void configureInheritedAppenders(EventSender<Object>[] inheritedLoggerAppenders) {
this.inheritedAppenders = inheritedLoggerAppenders;
}
// ------------------------------------------------------------------------
public EventLoggerFactory getEventLoggerFactory() {
return eventLoggerFactory;
}
public String getEventLoggerName() {
return eventLoggerName;
}
public void sendEvent(Object event) {
final EventSender<Object>[] appenders = inheritedAppenders;
final int len = appenders.length;
for (int i = 0; i < len; i++) {
try {
appenders[i].sendEvent(event);
} catch(Exception ex) {
LOG.error("Failed to sendEvent on eventLogger '" + eventLoggerName + "' to appender " + appenders[i]
+ ", ex:" + ex.getMessage() + " ... ignore, no rethrow!");
}
}
}
public void sendEvents(Collection<Object> events) {
final EventSender<Object>[] appenders = inheritedAppenders;
final int len = appenders.length;
for (int i = 0; i < len; i++) {
try {
appenders[i].sendEvents(events);
} catch(Exception ex) {
LOG.error("Failed to sendEvents on eventLogger '" + eventLoggerName + "' to appender " + appenders[i]
+ ", ex:" + ex.getMessage() + " ... ignore, no rethrow!");
}
}
}
// ------------------------------------------------------------------------
@Override
public String toString() {
return "EventLogger[" + eventLoggerName + "]";
}
}