package org.sef4j.log.slf4j.slf4j2event; import org.sef4j.core.api.EventSender; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; /** * Adapter Slf4j Appender -> EventSender * convert from slf4j <code>append(ILoggingEvent)</code> -> to rich <code>sendEvent(LoggingEventExt)</code> * * this class transform the logging event ILoggingEvent into a richer event LoggingEventExt, * by adding information from LocalCallStack : path + parameters + inherited properties * * When a richer name-value is already provided (with temporary MASK-UNMASK) from LoggerExt class, * this will be used instead (i.e. raw log event is masked) * * @see Slf4jAppenderThreadLocalMask */ public class EventSenderSlf4jAppender extends AppenderBase<ILoggingEvent> { private EventSender<LoggingEventExt> targetEventSender; private Slf4jToLoggingEventExtMapper eventMapper = new Slf4jToLoggingEventExtMapper(); // ------------------------------------------------------------------------ public EventSenderSlf4jAppender(EventSender<LoggingEventExt> targetEventSender) { this.targetEventSender = targetEventSender; } public EventSender<LoggingEventExt> getTargetEventSender() { return targetEventSender; } // ------------------------------------------------------------------------ @Override protected void append(ILoggingEvent slf4jEvent) { LoggingEventExt evt; Slf4jAppenderEventMask threadMask = Slf4jAppenderThreadLocalMask.currEventMask(); if (threadMask.isMask()) { evt = threadMask.getRichLoggingEventExt(); // may be null => nothing converted to log! if (evt == null && threadMask.eventMapper != null) { evt = threadMask.eventMapper.slf4jEventToEvent(slf4jEvent); } } else { evt = eventMapper.slf4jEventToEvent(slf4jEvent); } // *** delegate to *** if (evt != null) { targetEventSender.sendEvent(evt); } } }