<div dir="ltr">Hi,<div><br></div><div>I'm trying to implement a TCP server which logs to different appenders depending on the message content. I'm using ServerSocketReceiver and <span style="color:rgb(0,0,0);font-family:Menlo;font-size:9pt">SiftingAppender</span> strategy based on MDC value. <br></div><div><br></div><div>Here's my snippet: </div><div><pre style="color:rgb(0,0,0);font-size:9pt"><font face="arial, sans-serif">siftingAppender.setAppenderFactory((Context context1, String discriminatingValue) -> {<br><br>    Appender appender;<br>    <span style="color:rgb(0,0,128);font-weight:bold">if </span>(<span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">DISCRIMINATOR_DEFAULT_VALUE</span>.equals(discriminatingValue)) {<br>        ConsoleAppender<ILoggingEvent> consoleAppender = <span style="color:rgb(0,0,128);font-weight:bold">new </span>ConsoleAppender<>();<br>        consoleAppender.setContext(<span style="color:rgb(102,14,122)">context</span>);<br>        consoleAppender.setEncoder(<span style="font-style:italic">consoleOnlyEncoder</span>(<span style="color:rgb(102,14,122)">context</span>));<br>        consoleAppender.setName(<span style="color:rgb(0,128,0);font-weight:bold">"MY_CONSOLE_APPENDER"</span>);<br>        consoleAppender.start();<br>        appender = consoleAppender;<br>    } <span style="color:rgb(0,0,128);font-weight:bold">else </span>{<br>        RollingFileAppender rollingFileAppender = <span style="font-style:italic">rollingFileAppender</span>(<span style="color:rgb(0,128,0);font-weight:bold">"MY_ROLLING_APPENDER"</span>,<br>                <span style="color:rgb(0,128,0);font-weight:bold">"myPrefix." </span>+ discriminatingValue + <span style="color:rgb(0,128,0);font-weight:bold">".%d{yyyy-MM-dd_HH-mm}.log"</span>,<br>                <span style="color:rgb(102,14,122)">context</span>);<br><br>        AsyncAppender asyncAppender = <span style="font-style:italic">asyncAppender</span>(rollingFileAppender, <span style="color:rgb(102,14,122)">context</span>);<br><br>        appender = asyncAppender;<br>    }<br><br>    <span style="color:rgb(0,0,128);font-weight:bold">return </span>appender;<br>});</font></pre></div><div><br></div><div><br></div><div>Let's say that my MDC discriminator key is "filename". My first challenge with this approach is that the MDC value is not serialized and sent to server. So, I changed the message format to "filename={},msg{}" and I created a Turbo Filter, which would check if the rawMessage is equal to this expression and, if so, It would log using the MDC discriminator. Here's the snippet:</div><div><pre style="color:rgb(0,0,0);font-size:9pt"><font face="times new roman, serif"><span style="color:rgb(0,0,128);font-weight:bold">private static void </span>addMDCInterceptorTurboFilter(LoggerContext context) {<br>    String regex = <span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">DISCRIMINATOR_KEY</span>.concat(<span style="color:rgb(0,128,0);font-weight:bold">"={},"</span>).concat(<span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">MESSAGE_KEY</span>).concat(<span style="color:rgb(0,128,0);font-weight:bold">"={}"</span>); <span style="color:rgb(128,128,128);font-style:italic">// "filename={},msg={}"<br></span><span style="color:rgb(128,128,128);font-style:italic"><br></span><span style="color:rgb(128,128,128);font-style:italic">    </span>TurboFilter mdcInterceptorFilter = <span style="color:rgb(0,0,128);font-weight:bold">new </span>TurboFilter() {<br>        <span style="color:rgb(128,128,0)">@Override<br></span><span style="color:rgb(128,128,0)">        </span><span style="color:rgb(0,0,128);font-weight:bold">public </span>FilterReply decide(Marker marker, ch.qos.logback.classic.Logger logger, Level level,<br>                                  String rawMessage, Object[] params, Throwable t) {<br><br>            <span style="color:rgb(0,0,128);font-weight:bold">if </span>(params != <span style="color:rgb(0,0,128);font-weight:bold">null </span>&& <span style="color:rgb(102,14,122)">regex</span>.equals(rawMessage)) {<br>                MDC.<span style="font-style:italic">put</span>(<span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">DISCRIMINATOR_KEY</span>, (String) params[<span style="color:rgb(0,0,255)">0</span>]);<br>                logger.log(marker, <span style="color:rgb(0,0,128);font-weight:bold">this</span>.getClass().getName(), Level.<span style="font-style:italic">toLocationAwareLoggerInteger</span>(level),<br>                        (String) params[<span style="color:rgb(0,0,255)">1</span>], <span style="color:rgb(0,0,128);font-weight:bold">null</span>, <span style="color:rgb(0,0,128);font-weight:bold">null</span>);<br>                MDC.<span style="font-style:italic">remove</span>(<span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">DISCRIMINATOR_KEY</span>);<br><br>                <span style="color:rgb(0,0,128);font-weight:bold">return </span>FilterReply.<span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">DENY</span>;<br>            }<br><br>            <span style="color:rgb(0,0,128);font-weight:bold">return </span>FilterReply.<span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">NEUTRAL</span>;<br>        }<br>    };<br>    context.addTurboFilter(mdcInterceptorFilter);<br>    mdcInterceptorFilter.setName(<span style="color:rgb(0,128,0);font-weight:bold">"MY_MDC_INTERCEPTOR_FILTER"</span>);<br>    mdcInterceptorFilter.start();<br>}</font></pre></div><div><br></div><div>My challenge in the above approach is that neither the <i>rawMessage</i> nor <i>params</i> are populated at this time. So I can't set the MDC properly.</div><div>Another approach that I tried was to set the filter to the <span style="color:rgb(0,0,0);font-family:Menlo;font-size:12px">SiftingAppender</span> and set the MDC there, but it didn't work either. Here's the snippet:</div><div><pre style="color:rgb(0,0,0);font-size:9pt"><font face="times new roman, serif"><span style="color:rgb(0,0,128);font-weight:bold">private </span>Filter<ILoggingEvent> addMDCInterceptorFilter(String keyDiscriminator, String messageKey) {<br>    String regex = keyDiscriminator.concat(<span style="color:rgb(0,128,0);font-weight:bold">"={},"</span>).concat(messageKey).concat(<span style="color:rgb(0,128,0);font-weight:bold">"={}"</span>);<br>    Filter<ILoggingEvent> filter = <span style="color:rgb(0,0,128);font-weight:bold">new </span>Filter<ILoggingEvent>() {<br>        <span style="color:rgb(128,128,0)">@Override<br></span><span style="color:rgb(128,128,0)">        </span><span style="color:rgb(0,0,128);font-weight:bold">public </span>FilterReply decide(ILoggingEvent event) {<br>            <span style="color:rgb(0,0,128);font-weight:bold">if </span>(<span style="color:rgb(102,14,122)">regex</span>.equals(event.getMessage())) {<br>                MDC.<span style="font-style:italic">put</span>(<span style="color:rgb(102,14,122)">keyDiscriminator</span>, (String)event.getArgumentArray()[<span style="color:rgb(0,0,255)">0</span>]);<br>            } <span style="color:rgb(0,0,128);font-weight:bold">else </span>{<br>                MDC.<span style="font-style:italic">remove</span>(<span style="color:rgb(102,14,122)">keyDiscriminator</span>);<br>            }<br><br>            <span style="color:rgb(0,0,128);font-weight:bold">return </span>FilterReply.<span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">NEUTRAL</span>;<br>        }<br>    };<br>    filter.start();<br>    <span style="color:rgb(0,0,128);font-weight:bold">return </span>filter;<br>}</font></pre></div><div><br></div><div>Could you guys guide me how to accomplish this scenario ? Please find the full source for sake of completeness.</div><div><br></div><div>Thanks,</div><div><font face="arial, sans-serif"><br></font></div><div><pre style="color:rgb(0,0,0);font-size:9pt"><font face="arial, sans-serif"><span style="color:rgb(0,0,128);font-weight:bold">import </span>ch.qos.logback.classic.AsyncAppender;<br><span style="color:rgb(0,0,128);font-weight:bold">import </span>ch.qos.logback.classic.Level;<br><span style="color:rgb(0,0,128);font-weight:bold">import </span>ch.qos.logback.classic.LoggerContext;<br><span style="color:rgb(0,0,128);font-weight:bold">import </span>ch.qos.logback.classic.encoder.PatternLayoutEncoder;<br><span style="color:rgb(0,0,128);font-weight:bold">import </span>ch.qos.logback.classic.net.server.ServerSocketReceiver;<br><span style="color:rgb(0,0,128);font-weight:bold">import </span>ch.qos.logback.classic.sift.MDCBasedDiscriminator;<br><span style="color:rgb(0,0,128);font-weight:bold">import </span>ch.qos.logback.classic.sift.SiftingAppender;<br><span style="color:rgb(0,0,128);font-weight:bold">import </span>ch.qos.logback.classic.spi.ILoggingEvent;<br><span style="color:rgb(0,0,128);font-weight:bold">import </span>ch.qos.logback.classic.turbo.TurboFilter;<br><span style="color:rgb(0,0,128);font-weight:bold">import </span>ch.qos.logback.core.Appender;<br><span style="color:rgb(0,0,128);font-weight:bold">import </span>ch.qos.logback.core.ConsoleAppender;<br><span style="color:rgb(0,0,128);font-weight:bold">import </span>ch.qos.logback.core.Context;<br><span style="color:rgb(0,0,128);font-weight:bold">import </span>ch.qos.logback.core.encoder.Encoder;<br><span style="color:rgb(0,0,128);font-weight:bold">import </span>ch.qos.logback.core.rolling.RollingFileAppender;<br><span style="color:rgb(0,0,128);font-weight:bold">import </span>ch.qos.logback.core.rolling.RollingPolicy;<br><span style="color:rgb(0,0,128);font-weight:bold">import </span>ch.qos.logback.core.rolling.TimeBasedRollingPolicy;<br><span style="color:rgb(0,0,128);font-weight:bold">import </span>ch.qos.logback.core.spi.FilterReply;<br><span style="color:rgb(0,0,128);font-weight:bold">import </span>ch.qos.logback.core.util.StatusPrinter;<br><span style="color:rgb(0,0,128);font-weight:bold">import </span>org.slf4j.LoggerFactory;<br><span style="color:rgb(0,0,128);font-weight:bold">import </span>org.slf4j.MDC;<br><span style="color:rgb(0,0,128);font-weight:bold">import </span>org.slf4j.Marker;<br><br><span style="color:rgb(0,0,128);font-weight:bold">import </span>java.nio.charset.Charset;<br><br><span style="color:rgb(0,0,128);font-weight:bold">public class </span>MySocketServer {<br><br>    <span style="color:rgb(0,0,128);font-weight:bold">private static final </span>String <span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">DISCRIMINATOR_KEY </span>= <span style="color:rgb(0,128,0);font-weight:bold">"filename"</span>;<br>    <span style="color:rgb(0,0,128);font-weight:bold">private static final </span>String <span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">DISCRIMINATOR_DEFAULT_VALUE </span>= <span style="color:rgb(0,128,0);font-weight:bold">"unknown"</span>;<br>    <span style="color:rgb(0,0,128);font-weight:bold">private static final </span>String <span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">MESSAGE_KEY </span>= <span style="color:rgb(0,128,0);font-weight:bold">"msg"</span>;<br><br>    <span style="color:rgb(0,0,128);font-weight:bold">public static void </span>main(String[] args) <span style="color:rgb(0,0,128);font-weight:bold">throws </span>InterruptedException {<br>        LoggerContext context = (LoggerContext) LoggerFactory.<span style="font-style:italic">getILoggerFactory</span>();<br>        StatusPrinter.<span style="font-style:italic">print</span>(context);<br><br>        <span style="font-style:italic">addMDCInterceptorTurboFilter</span>(context);<br><br>        <span style="font-style:italic">newServerSocketReceiver</span>(context);<br>        <span style="font-style:italic">addAppenders</span>(context);<br><br>        Thread.<span style="font-style:italic">sleep</span>(Long.<span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">MAX_VALUE</span>);<br>    }<br><br>    <span style="color:rgb(0,0,128);font-weight:bold">private static void </span>newServerSocketReceiver(LoggerContext context) {<br>        ServerSocketReceiver serverSocketReceiver = <span style="color:rgb(0,0,128);font-weight:bold">new </span>ServerSocketReceiver();<br>        serverSocketReceiver.setContext(context);<br>        serverSocketReceiver.setPort(<span style="color:rgb(0,0,255)">6000</span>);<br>        serverSocketReceiver.setAddress(<span style="color:rgb(0,128,0);font-weight:bold">"localhost"</span>);<br>        serverSocketReceiver.start();<br>    }<br><br>    <span style="color:rgb(0,0,128);font-weight:bold">private static void </span>addAppenders(LoggerContext context) {<br>        SiftingAppender siftingAppender = <span style="font-style:italic">siftingAppender</span>(context);<br><br>        ch.qos.logback.classic.Logger logger = context.getLogger(ch.qos.logback.classic.Logger.<span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">ROOT_LOGGER_NAME</span>);<br>        logger.detachAndStopAllAppenders();<br>        logger.addAppender(siftingAppender);<br>    }<br><br>    <span style="color:rgb(0,0,128);font-weight:bold">private static </span>SiftingAppender siftingAppender(LoggerContext context) {<br>        SiftingAppender siftingAppender = <span style="color:rgb(0,0,128);font-weight:bold">new </span>SiftingAppender();<br>        siftingAppender.setContext(context);<br>        siftingAppender.setName(<span style="color:rgb(0,128,0);font-weight:bold">"MY_SIFT_APPENDER"</span>);<br>        siftingAppender.setDiscriminator(<span style="font-style:italic">getMdcBasedDiscriminator</span>(context));<br><br>        siftingAppender.setAppenderFactory((Context context1, String discriminatingValue) -> {<br><br>            Appender appender;<br>            <span style="color:rgb(0,0,128);font-weight:bold">if </span>(<span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">DISCRIMINATOR_DEFAULT_VALUE</span>.equals(discriminatingValue)) {<br>                ConsoleAppender<ILoggingEvent> consoleAppender = <span style="color:rgb(0,0,128);font-weight:bold">new </span>ConsoleAppender<>();<br>                consoleAppender.setContext(<span style="color:rgb(102,14,122)">context</span>);<br>                consoleAppender.setEncoder(<span style="font-style:italic">consoleOnlyEncoder</span>(<span style="color:rgb(102,14,122)">context</span>));<br>                consoleAppender.setName(<span style="color:rgb(0,128,0);font-weight:bold">"MY_CONSOLE_APPENDER"</span>);<br>                consoleAppender.start();<br>                appender = consoleAppender;<br>            } <span style="color:rgb(0,0,128);font-weight:bold">else </span>{<br>                RollingFileAppender rollingFileAppender = <span style="font-style:italic">rollingFileAppender</span>(<span style="color:rgb(0,128,0);font-weight:bold">"MY_ROLLING_APPENDER"</span>,<br>                        <span style="color:rgb(0,128,0);font-weight:bold">"myPrefix." </span>+ discriminatingValue + <span style="color:rgb(0,128,0);font-weight:bold">".%d{yyyy-MM-dd_HH-mm}.log"</span>,<br>                        <span style="color:rgb(102,14,122)">context</span>);<br><br>                AsyncAppender asyncAppender = <span style="font-style:italic">asyncAppender</span>(rollingFileAppender, <span style="color:rgb(102,14,122)">context</span>);<br><br>                appender = asyncAppender;<br>            }<br><br>            <span style="color:rgb(0,0,128);font-weight:bold">return </span>appender;<br>        });<br><br>        siftingAppender.start();<br>        <span style="color:rgb(0,0,128);font-weight:bold">return </span>siftingAppender;<br>    }<br><br>    <span style="color:rgb(0,0,128);font-weight:bold">private static </span>AsyncAppender asyncAppender(Appender appender, LoggerContext context) {<br>        AsyncAppender asyncAppender = <span style="color:rgb(0,0,128);font-weight:bold">new </span>AsyncAppender();<br>        asyncAppender.setContext(context);<br>        asyncAppender.setName(<span style="color:rgb(0,128,0);font-weight:bold">"MY_ASYNC_BACKUP_APPENDER"</span>);<br>        asyncAppender.setQueueSize(<span style="color:rgb(0,0,255)">512</span>);<br>        asyncAppender.addAppender(appender);<br>        asyncAppender.start();<br>        <span style="color:rgb(0,0,128);font-weight:bold">return </span>asyncAppender;<br>    }<br><br>    <span style="color:rgb(0,0,128);font-weight:bold">private static </span>MDCBasedDiscriminator getMdcBasedDiscriminator(LoggerContext context) {<br>        MDCBasedDiscriminator discriminator = <span style="color:rgb(0,0,128);font-weight:bold">new </span>MDCBasedDiscriminator();<br>        discriminator.setContext(context);<br>        discriminator.setKey(<span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">DISCRIMINATOR_KEY</span>);<br>        discriminator.setDefaultValue(<span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">DISCRIMINATOR_DEFAULT_VALUE</span>);<br>        discriminator.start();<br>        <span style="color:rgb(0,0,128);font-weight:bold">return </span>discriminator;<br>    }<br><br>    <span style="color:rgb(0,0,128);font-weight:bold">private static </span>RollingFileAppender rollingFileAppender(String name,<br>                                                    String fileNamePattern,<br>                                                    LoggerContext context) {<br>        RollingFileAppender rollingFileAppender = <span style="color:rgb(0,0,128);font-weight:bold">new </span>RollingFileAppender();<br>        rollingFileAppender.setContext(context);<br>        rollingFileAppender.setRollingPolicy(<span style="font-style:italic">timeBasedRollingPolicy</span>(rollingFileAppender, fileNamePattern, context));<br>        rollingFileAppender.setEncoder(<span style="font-style:italic">messageOnlyEncoder</span>(context));<br>        rollingFileAppender.setName(name);<br>        rollingFileAppender.start();<br>        <span style="color:rgb(0,0,128);font-weight:bold">return </span>rollingFileAppender;<br>    }<br><br>    <span style="color:rgb(0,0,128);font-weight:bold">private static </span>RollingPolicy timeBasedRollingPolicy(RollingFileAppender rollingFileAppender,<br>                                                 String fileNamePattern,<br>                                                 LoggerContext context) {<br>        <span style="color:rgb(0,0,128);font-weight:bold">final </span>TimeBasedRollingPolicy timeBasedRollingPolicy = <span style="color:rgb(0,0,128);font-weight:bold">new </span>TimeBasedRollingPolicy();<br>        timeBasedRollingPolicy.setContext(context);<br>        timeBasedRollingPolicy.setFileNamePattern(fileNamePattern);<br>        timeBasedRollingPolicy.setParent(rollingFileAppender);<br>        timeBasedRollingPolicy.start();<br>        <span style="color:rgb(0,0,128);font-weight:bold">return </span>timeBasedRollingPolicy;<br>    }<br><br>    <span style="color:rgb(0,0,128);font-weight:bold">private static </span>Encoder messageOnlyEncoder(LoggerContext context) {<br>        <span style="color:rgb(0,0,128);font-weight:bold">final </span>PatternLayoutEncoder patternLayoutEncoder = <span style="color:rgb(0,0,128);font-weight:bold">new </span>PatternLayoutEncoder();<br>        patternLayoutEncoder.setPattern(<span style="color:rgb(0,128,0);font-weight:bold">"%mdc %msg%n"</span>);<br>        patternLayoutEncoder.setCharset(Charset.<span style="font-style:italic">forName</span>(<span style="color:rgb(0,128,0);font-weight:bold">"utf-8"</span>));<br>        patternLayoutEncoder.setContext(context);<br>        patternLayoutEncoder.start();<br>        <span style="color:rgb(0,0,128);font-weight:bold">return </span>patternLayoutEncoder;<br>    }<br><br>    <span style="color:rgb(0,0,128);font-weight:bold">private static </span>Encoder consoleOnlyEncoder(LoggerContext context) {<br>        <span style="color:rgb(0,0,128);font-weight:bold">final </span>PatternLayoutEncoder patternLayoutEncoder = <span style="color:rgb(0,0,128);font-weight:bold">new </span>PatternLayoutEncoder();<br>        patternLayoutEncoder.setPattern(<span style="color:rgb(0,128,0);font-weight:bold">"%-4relative [%thread] %-5level %logger{35} - %msg %n"</span>);<br>        patternLayoutEncoder.setCharset(Charset.<span style="font-style:italic">forName</span>(<span style="color:rgb(0,128,0);font-weight:bold">"utf-8"</span>));<br>        patternLayoutEncoder.setContext(context);<br>        patternLayoutEncoder.start();<br>        <span style="color:rgb(0,0,128);font-weight:bold">return </span>patternLayoutEncoder;<br>    }<br><br>    <span style="color:rgb(0,0,128);font-weight:bold">private static void </span>addMDCInterceptorTurboFilter(LoggerContext context) {<br>        String regex = <span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">DISCRIMINATOR_KEY</span>.concat(<span style="color:rgb(0,128,0);font-weight:bold">"={},"</span>).concat(<span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">MESSAGE_KEY</span>).concat(<span style="color:rgb(0,128,0);font-weight:bold">"={}"</span>); <span style="color:rgb(128,128,128);font-style:italic">// "filename={},msg={}"<br></span><span style="color:rgb(128,128,128);font-style:italic"><br></span><span style="color:rgb(128,128,128);font-style:italic">        </span>TurboFilter mdcInterceptorFilter = <span style="color:rgb(0,0,128);font-weight:bold">new </span>TurboFilter() {<br>            <span style="color:rgb(128,128,0)">@Override<br></span><span style="color:rgb(128,128,0)">            </span><span style="color:rgb(0,0,128);font-weight:bold">public </span>FilterReply decide(Marker marker, ch.qos.logback.classic.Logger logger, Level level,<br>                                      String rawMessage, Object[] params, Throwable t) {<br><br>                <span style="color:rgb(0,0,128);font-weight:bold">if </span>(params != <span style="color:rgb(0,0,128);font-weight:bold">null </span>&& <span style="color:rgb(102,14,122)">regex</span>.equals(rawMessage)) {<br>                    MDC.<span style="font-style:italic">put</span>(<span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">DISCRIMINATOR_KEY</span>, (String) params[<span style="color:rgb(0,0,255)">0</span>]);<br>                    logger.log(marker, <span style="color:rgb(0,0,128);font-weight:bold">this</span>.getClass().getName(), Level.<span style="font-style:italic">toLocationAwareLoggerInteger</span>(level),<br>                            (String) params[<span style="color:rgb(0,0,255)">1</span>], <span style="color:rgb(0,0,128);font-weight:bold">null</span>, <span style="color:rgb(0,0,128);font-weight:bold">null</span>);<br>                    MDC.<span style="font-style:italic">remove</span>(<span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">DISCRIMINATOR_KEY</span>);<br><br>                    <span style="color:rgb(0,0,128);font-weight:bold">return </span>FilterReply.<span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">DENY</span>;<br>                }<br><br>                <span style="color:rgb(0,0,128);font-weight:bold">return </span>FilterReply.<span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">NEUTRAL</span>;<br>            }<br>        };<br>        context.addTurboFilter(mdcInterceptorFilter);<br>        mdcInterceptorFilter.setName(<span style="color:rgb(0,128,0);font-weight:bold">"MY_MDC_INTERCEPTOR_FILTER"</span>);<br>        mdcInterceptorFilter.start();<br>    }<br>}</font><font face="Menlo"><br></font></pre></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div></div>