You could easyly write your own discriminator class combining JNDIBasedContextDiscriminator and MDCBasedDiscriminator. Here is an example:

public class CombinedDiscriminator extends ContextAwareBase implements
    Discriminator<ILoggingEvent> {

 private String defaultMDCVal = "default";

  public String getDiscriminatingValue(ILoggingEvent event) {
    String mdcValue = defaultMDCVal;
    Map<String, String> mdcMap = event.getMdc();
    if (mdcMap != null) {
      mdcValue = mdcMap.get(key);
    }
    String contextName =  event.getLoggerContextVO().getName();
    return contextName + mdcValue;
  }
  ..etc
}


HTH,
--
Ceki
On 23.02.2011 13:39, José Juan Montiel wrote:
Hi,

    Hi, again with another question.

    With aspectj, in injecting a var in MCD, something like this...

    MDC.put("code",var);

    in some places, depending something, and i'm using this to generate a
    diferent file for this something like

    <appender name="APPENDER"
    class="ch.qos.logback.classic.sift.SiftingAppender">
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
    <evaluator
    class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
    <expression>
                        (marker != null)
    &amp;&amp; (
                            (marker.contains("ASPECTJ")) ||
                            (marker.contains("SOAP")))
    </expression>
    </evaluator>
    <onMatch>DENY</onMatch>
    </filter>
    <discriminator>
    <Key>code</Key>
    <DefaultValue>0000</DefaultValue>
    </discriminator>
    <sift>
    <appender name="FILE-${code}"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <prudent>${prudent}</prudent>

    <!-- 5 l?neas de stacktrace para las excepciones -->
    <encoder
    class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    <Pattern>%date - [%thread] - %.-20M - %L -
    cn=%contextName - [%thread] - [%X{code}] - %message%n
    %exception{5}</Pattern>
    </encoder>

    <rollingPolicy
    class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

    
<FileNamePattern>${USER_HOME}/${backupDir}${code}.%d${patronRolling}</FileNamePattern>

    <MaxHistory>${maxHistory}</MaxHistory>
    </rollingPolicy>
    </appender>
    </sift>
    </appender>


    ASPECTJ and SOAP are Markers of other traces, that i don't want to
    see here.
    This way i get

    in my root log directory ${USER_HOME}/${backupDir} files like

    0001.log
    0002.log

    But, now i have multile apps (wars and ejbs) where i use

    web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xmlns="
    http://java.sun.com/xml/ns/javaee"; xmlns:web="
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"; xsi:schemaLocation="
    http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"; id="WebApp_ID"
    version="2.5">
        ...

    <env-entry>
    <description>JNDI logging context for this app</description>
    <env-entry-name>logback/context-name</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>APP1</env-entry-value>
    </env-entry>
    <env-entry>
    <description>URL for configuring logback context</description>
    <env-entry-name>logback/configuration-resource</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>logback.xml</env-entry-value>
    </env-entry>

        ...

    </web-app>



    ejb-jar.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise
    JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd";>
    <ejb-jar>
    <enterprise-beans>
    <session>
                ...

    <env-entry>
    <description>JNDI logging context for this app</description>
    <env-entry-name>logback/context-name</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>EJB1</env-entry-value>
    </env-entry>
    <env-entry>
    <description>URL for configuring logback
    context</description>

    <env-entry-name>logback/configuration-resource</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>logback.xml</env-entry-value>
    </env-entry>

                ...
    </session>
    </enterprise-beans>

        ...
    </ejb-jar>

    a env-entry to identificate. I know that insede file, i use
    cn=%contextName
    to see this context but...

    How could i use this context like i use ${code} to separete this files
    (0001.log, 0002.log) in diferents directories.


I'll make more simple... how to mix

<discriminator
class="ch.qos.logback.classic.sift.JNDIBasedContextDiscriminator">
<defaultValue>unknown</defaultValue>
</discriminator>

and

<discriminator>
<Key>code</Key>
<DefaultValue>0000</DefaultValue>
</discriminator>

this is a MDC, form use %code (inside log line) like ${contextName} in
name file.

Can i have 2 discriminator inside 1 appender?

PD: logback version 0.9.21.

Thanks.

--
Jose Juan Montiel Martinez
Eurobits Technologies
Calle Musgo 3, 1ª Planta
28023 Madrid
T +34-917080300
F +34-913077480
[email protected] <mailto:[email protected]>
http://www.eurobits.com



_______________________________________________
Logback-user mailing list
[email protected]
http://qos.ch/mailman/listinfo/logback-user


_______________________________________________
Logback-user mailing list
[email protected]
http://qos.ch/mailman/listinfo/logback-user

Reply via email to