Folks,
<div><br></div><div>Just wondering if it is possible to perform conditional processing in Logback by inspecting the MDC for the presence of and/or value of certain keys. The documentation states "<span style="background-color:rgb(255,255,255);font-family:Verdana,Arial,SunSans-Regular,sans-serif;font-size:medium;line-height:20px">The condition is a Java expression in which only context properties or system properties are accessible" </span>Which "context" is it referring to here? Is the MDC map visible to the conditional expression?</div>

<div><br></div><div>Why do I want to do this? Well, in this instance I have a small web-app consisting of a number of servlets. The servlets are stateless/sessionless - they service individual requests from clients, but no session is maintained. In the absence of a unique session ID (I could force a session to be created using getSession() - but that would be wasteful of resources for servlets which don't really need one) I would like to insert another UUID into the log files generated by the server so that its easy to zone in on all the log messages generated as the result of a single incoming client request.</div>

<div><br></div><div>The approach I've taken here is to create a Servlet Filter which intercepts all URL request patterns (/*), generates a new UUID and inserts it into the MDC with a specific key (e.g. MyApp-UUID) and removes the key again after control is passed back from the servlet to the filter. I then updated the encoder pattern configuration for the appropriate appenders to insert %X{MyApp-UUID} - and this works as expected - I get a unique UUID value for all messages associated with the same servlet request. However, to take this one step further I would like to use different encoder patterns dependent on whether or not a specific MDC key is present.</div>

<div><br></div><div>The following is some pseudo-config which hopefully illustrates the concept:</div><div><br></div><div>---------------------------</div><div><br></div><div><configuration></div><div><br></div><div>

  <appender name="MyAppender" class="..."></div><div><br></div><div><div>    <encoder></div><div>      <if condition='isDefined("MyApp-UUID")'></div><div>        <then><pattern>... [%X{AssetTracker-UUID}] ...</pattern></then></div>

<div>        <else><pattern>... some other pattern ...</pattern></else></div><div>      </if></div><div>    </encoder></div></div><div><br></div><div>  </appender></div><div><br>
</div>
<div></configuration></div><div><br></div><div>---------------------------</div><div><br></div><div>So, to recap:</div><div><br></div><div>(a) can conditional processing expressions access key/value pairs in the MDC map? From my basic experimentation, I'm guessing the answer is no - but then I could just be referencing it incorrectly</div>

<div>(b) if the answer to (a) is no, then is there a more suitable approach I should be using instead.</div><div><br></div><div>Note: Since conditional processing can be used anywhere within the logback configuration I may want to use a similar technique for completely different purposes in future, the example I've given just happens to focus on encoder patterns for illustrative purposes. So I'm after a generic solution that allows conditional processing based on MDC key/value pairs.</div>

<div><br></div><div>Regards,</div><div><br></div><div>Shane</div>