2016-05-24 9 views
2

Ich habe eine Anwendung und mehr als einen Kunden, ich möchte die Protokolle nach customerId (Java-Variable) trennen, erstellen Sie auch verschiedene Arten von Level-Level-Hierarchie.Log4j2 - Eine App, mehrere Protokolle und Ebenen

Zum Beispiel:

/logs/customer1/admin.txt

/logs/customer1/support.txt

/logs/customer2/admin.txt

/logs/customer2/support.txt

ich konnte trennen von "Ebenen" auf diese Weise: log4j2.xml

<?xml version="1.0" encoding="UTF-8"?> 
<configuration status="WARN"> 
    <properties> 
    <property name="appName">App</property> 
    <property name="pattern">%d{HH:mm:ss.SSS} ${appName} %-5level %logger{36} - %msg%n</property> 

    </properties> 

    <appenders> 
    <File name="adm" fileName="c:\logs\adm.txt" append="true"> 
      <PatternLayout pattern="${pattern}" /> 
    </File> 
    <File name="support" fileName="c:\logs\support.txt" append="true"> 
      <PatternLayout pattern="${pattern}" /> 
    </File> 
    </appenders> 
    <loggers> 
     <Logger name="adm" additivity="false"> 
      <AppenderRef ref="adm" /> 
     </Logger> 
     <Logger name="support" additivity="false"> 
      <AppenderRef ref="adm" /> 
      <AppenderRef ref="support" /> 
     </Logger> 
     <root level="ERROR"> 
      <appender-ref ref="support" /> 
      <appender-ref ref="adm" /> 
     </root> 
    </loggers> 
</configuration> 

und in der java:

static final Logger adm = LogManager.getLogger("adm"); 
static final Logger support= LogManager.getLogger("support"); 

mit dieser Konfiguration, wenn ich "support.info" verwenden ... geht das Protokoll in den beiden Dateien. und es ist perfekt. aber ich konnte nicht durch customerID trennen

Ich mache es richtig? Wie kann ich nach customerId (Java-Variable) trennen?

Vielen Dank.

Antwort

0

Sie können Protokolle trennen, indem Sie den RoutingAppender verwenden. Im Grunde legen Sie die Kunden-ID in den ThreadContext und lassen dann den RoutingAppender einen FileAppender erstellen, der basierend auf einem Muster in einen Speicherort schreibt. Dies hat auch den Vorteil, dass die Kundennummer in jeden Protokollsatz aufgenommen werden kann und Ihre Anwendung sie auch von dort abrufen kann, anstatt dass sie überall als Parameter übergeben werden muss.

Ein Beispiel dafür finden Sie in http://logging.apache.org/log4j/2.x/manual/appenders.html#RoutingAppender.

0

Jeder appender ich für ersetzt:

<Routing name="sadm"> 
     <Routes pattern="${ctx:customerId}"> 
      <Route> 
       <File name="sadm" fileName="${path}\${ctx:customerId}\sadm.txt" 
        append="true"> 
        <PatternLayout pattern="${pattern}" /> 
       </File> 
      </Route> 
      <Route ref="sadm_commom" key="${ctx:customerId}" /> 
     </Routes> 
    </Routing> 

und schuf eine neue appender genannt: sadm_commom

  <Route ref="sadm_commom" key="${ctx:customerId}" /> 

falls die customerID null ist.

+0

Wollen Sie sagen, dass der RoutingAppender für Sie arbeitet oder ist das eine Frage? – rgoers