package org.sef4j.log.slf4j.slf4j2event; import org.sef4j.log.slf4j.LogLevel; import org.sef4j.log.slf4j.Slf4jLoggerUtil; import org.slf4j.Logger; /** * ThreadLocal mask support for replacing current slf4j logged event by richer event or mask it * * @see EventSenderSlf4jAppender */ public final class Slf4jAppenderThreadLocalMask { private static final ThreadLocal<Slf4jAppenderEventMask> threadLocalAppenderMask = new ThreadLocal<Slf4jAppenderEventMask>() { @Override protected Slf4jAppenderEventMask initialValue() { return new Slf4jAppenderEventMask(false, null, null); } }; // ------------------------------------------------------------------------ /* private to force all static */ private Slf4jAppenderThreadLocalMask() { } // ------------------------------------------------------------------------ public static Slf4jAppenderEventMask currEventMask() { return threadLocalAppenderMask.get(); } /** * typical code usage: * <pre> * {@code * * LoggingEventExt event = new LoggingEventExt(); // <= fill with rich name-values ... * * LoggingEventExt prev = Slf4jAppenderThreadLocalMask.pushTmpMaskWithReplaceRichEvent(richEvent); * try { * log.info("formatted text..."); * } finally { * EventLoggerAdapterAppender.popTmpUnmask(prev); * } * * }</pre> * @param event * @return previous mask to restore to <code>popTmpUnmask()</code> */ public static Slf4jAppenderEventMask pushTmpMaskWithReplaceRichEvent(Slf4jAppenderEventMask mask) { Slf4jAppenderEventMask threadMask = threadLocalAppenderMask.get(); Slf4jAppenderEventMask prev = threadMask.getCopy(); threadMask.set(mask); return prev; } /** alias for <code>pushTmpMaskWithReplaceRichEvent(new Slf4jAppenderEventMask(true, event))</code> */ public static Slf4jAppenderEventMask pushTmpMaskWithReplaceRichEvent(LoggingEventExt event) { return pushTmpMaskWithReplaceRichEvent(new Slf4jAppenderEventMask(true, event, null)); } public static void popTmpUnmask(Slf4jAppenderEventMask prev) { Slf4jAppenderEventMask threadMask = threadLocalAppenderMask.get(); threadMask.set(prev); } // utility method for <code>pushMask..(); try { log...(); } finally { popTmpUnmask(); } // ------------------------------------------------------------------------ public static void maskLogLevelText(Slf4jAppenderEventMask tmpMmask, Logger slf4jLogger, LogLevel logLevel, String text) { Slf4jAppenderEventMask prevMask = Slf4jAppenderThreadLocalMask.pushTmpMaskWithReplaceRichEvent(tmpMmask); try { Slf4jLoggerUtil.logLevelText(slf4jLogger, logLevel, text); } finally { Slf4jAppenderThreadLocalMask.popTmpUnmask(prevMask); } } public static void maskLogLevelTextEx(Slf4jAppenderEventMask tmpMmask, Logger slf4jLogger, LogLevel logLevel, String text, Throwable ex) { Slf4jAppenderEventMask prevMask = Slf4jAppenderThreadLocalMask.pushTmpMaskWithReplaceRichEvent(tmpMmask); try { Slf4jLoggerUtil.logLevelTextException(slf4jLogger, logLevel, text, ex); } finally { Slf4jAppenderThreadLocalMask.popTmpUnmask(prevMask); } } }