<div dir="ltr"><span style="color:rgb(0,0,0);font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:13px;line-height:17.0000991821289px">I have a layout which is generating JSON from logging events and MDC Context. MDC is great and I want to add parameters to MDC Context conditionally. For example, I would like add request information as JSON into MDC conditionally on Error Level log entries. I am not familiar with Logback internals but gave a try with Logback Filter implementation. I have used:</span><br><div><span style="color:rgb(0,0,0);font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:13px;line-height:17.0000991821289px"><br></span></div><div><pre style="white-space:pre-wrap;margin-top:0px;margin-bottom:0px;padding:0px;font-size:13px;line-height:1.3em;max-height:30em;overflow:auto;word-wrap:normal;color:rgb(0,0,0)">   <span style="color:rgb(0,0,145);background-color:inherit">public</span> FilterReply decide(ILoggingEvent event) {

      <span style="color:rgb(128,128,128);background-color:inherit">// simplified <span style="color:rgb(0,0,145);background-color:inherit">for</span> demo
</span>      <span style="color:rgb(128,128,128);background-color:inherit">// conditionally I am putting some attributes here
</span>      Map<<span style="color:rgb(145,0,145);background-color:inherit">String</span>, <span style="color:rgb(145,0,145);background-color:inherit">String</span>> mdcPropertyMap = event.getMDCPropertyMap();
      <span style="color:rgb(0,0,145);background-color:inherit">if</span> (event.getLevel().isGreaterOrEqual(Level.ERROR)) {
         mdcPropertyMap.put(<span style="color:rgb(0,145,0);background-color:inherit">"demo"</span>, <span style="color:rgb(0,145,0);background-color:inherit">"demo"</span>);
      }
      <span style="color:rgb(0,0,145);background-color:inherit">return</span> FilterReply.ACCEPT;
   }
</pre></div><div><br></div><div><br></div><div><span style="color:rgb(0,0,0);font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:13px;line-height:17.0000991821289px">I am expecting mdcPropertyMap to be cleared for each event but it does not. LoggingEvent has a internal CACHED_NULL_MAP map and its modified per touch.</span><br></div><div><span style="color:rgb(0,0,0);font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:13px;line-height:17.0000991821289px"><br></span></div><div><pre style="white-space:pre-wrap;margin-top:0px;margin-bottom:0px;padding:0px;font-size:13px;line-height:1.3em;max-height:30em;overflow:auto;word-wrap:normal;color:rgb(0,0,0)"> <span style="color:rgb(0,0,145);background-color:inherit">private</span> <span style="color:rgb(0,0,145);background-color:inherit">static</span> <span style="color:rgb(0,0,145);background-color:inherit">final</span> Map<<span style="color:rgb(145,0,145);background-color:inherit">String</span>, <span style="color:rgb(145,0,145);background-color:inherit">String</span>> CACHED_NULL_MAP = <span style="color:rgb(0,0,145);background-color:inherit">new</span> HashMap<<span style="color:rgb(145,0,145);background-color:inherit">String</span>, <span style="color:rgb(145,0,145);background-color:inherit">String</span>>();</pre><pre style="white-space:pre-wrap;margin-top:0px;margin-bottom:0px;padding:0px;font-size:13px;line-height:1.3em;max-height:30em;overflow:auto;word-wrap:normal;color:rgb(0,0,0)"><br></pre><pre style="white-space:pre-wrap;margin-top:0px;margin-bottom:0px;padding:0px;font-size:13px;line-height:1.3em;max-height:30em;overflow:auto;word-wrap:normal;color:rgb(0,0,0)"><p style="margin:16px 0px 0px;padding:0px;font-family:Arial,FreeSans,Helvetica,sans-serif;line-height:17.0000991821289px;white-space:normal">I could not be sure but it seems a little bid buggy to me. Can someone verify this behaviour?</p><p style="margin:16px 0px 0px;padding:0px;font-family:Arial,FreeSans,Helvetica,sans-serif;line-height:17.0000991821289px;white-space:normal">For those who are interested why I am not using MDC.put in a Servlet Filter implementation because I am conditionally adding some attributes. Serialising HttpRequest into JSON is not cheap task but having Http Request information is giving great insights about error. Using Filter is the only way I found to add conditionally attributes so far. What I would like to use is:</p><p style="margin:16px 0px 0px;padding:0px;font-family:Arial,FreeSans,Helvetica,sans-serif;line-height:17.0000991821289px;white-space:normal"><br></p><pre style="white-space:pre-wrap;line-height:1.3em;margin-top:0px;margin-bottom:0px;padding:0px;max-height:30em;overflow:auto;word-wrap:normal">   <span style="color:rgb(0,0,145);background-color:inherit">public</span> FilterReply decide(ILoggingEvent event) {
      <span style="color:rgb(0,0,145);background-color:inherit">if</span> (event.getLevel().isGreaterOrEqual(Level.WARN)) {
         MDC.put(<span style="color:rgb(0,145,0);background-color:inherit">"demo"</span>, <span style="color:rgb(0,145,0);background-color:inherit">"demo"</span>);
      }
      <span style="color:rgb(0,0,145);background-color:inherit">return</span> FilterReply.ACCEPT;
   }</pre><div><br></div></pre></div></div>