2016-06-08 20 views
0

Ich benutze log4j 2 und ich habe die Notwendigkeit, verschiedene Protokolldateien basierend auf dem Wert eines bestimmten Schlüssels in ThreadContext Map zu schreiben. Jeder Thread setzt den Schlüssel auf einen bestimmten Wert (der wiederholt werden könnte ...). Dies ist der log4j2.xmlLog4j 2 verschiedene Protokolldateien für jeden Thread

<Configuration status="warn"> 
<Appenders> 
    <Routing name="Routing"> 
     <Routes pattern="$${ctx:KEY}">    
      <Route> 
       <RollingFile name="Rolling-${ctx:KEY}" fileName="logs/${ctx:KEY}.log" 
        filePattern="logs/${date:yyyy-MM}/${ctx:KEY}-%d{yyyy-MM-dd}-%i.log.gz"> 
        <PatternLayout> 
         <pattern>%d{ISO8601} [%t] %p %c{3} - %m%n</pattern> 
        </PatternLayout> 
        <Policies> 
         <TimeBasedTriggeringPolicy interval="6" 
          modulate="true" /> 
         <SizeBasedTriggeringPolicy size="10 MB" /> 
        </Policies> 
       </RollingFile> 
      </Route> 
     </Routes> 
    </Routing> 
    <Async name="Async"> 
     <AppenderRef ref="Routing" /> 
    </Async> 
    </Appenders> 

    <Loggers> 
     <Root level="info" additivity="false"> 
      <AppenderRef ref="Async" /> 
     </Root> 
    </Loggers> 
</Configuration> 

Dies ist die Hauptklasse:

public class TestClass { 

public static void main (String[] args){ 
    /**FILTER OPERATION*/ 

    CorrelationBag corr = new CorrelationBag(); 
    corr.setID("AD65MASDAD654DF5SDF235SFD651SDFSDF321DSF"); 
    corr.setUsername("Username");  


    for (int i= 0; i<6; i++){   
     (new Thread(new MyService(i))).start(); 
     } 
    } 
} 

Und das ist schließlich das Thema Umsetzung:

public class MyService extends ServiceBase implements Runnable { 
int counter; 
public MyService(){} 

public MyService (int counter){ 
    this.counter = counter; 
} 

@Override 
public void run() { 
    ThreadContext.put("KEY", Thread.currentThread().getID()); 
    String param1 = "param1"; 
    String param2 = "param2"; 
    String param3 = "param3"; 
    String param4 = "param4"; 
    String param5 = "param5"; 
     info("WITH MARKER AND HEADERS,{},{}{},{},{}",param1,param2,param3,param4,param5);  
    ThreadContext.remove("threadName"); 

    } 
} 

Mit diesem Code Log4j schafft nur 1 log Datei bezogen auf nur 1 Thread-ID.

Wenn ich den Code im Debug-Modus ausführen, führt jede einzelne Anweisung Schritt für Schritt ... Log4j erstellt 6 Dateien, wie ich wollte. Ich denke, es könnte ein Nebenläufigkeitsproblem in meinem Code sein.

Jeder kann mir helfen?

Antwort

0

Ihr aktueller Code hat die Möglichkeit, dass jeder Thread erstellt, gestartet und beendet wird, bevor der nächste Thread erstellt wird, damit das Thread-Objekt wiederverwendet werden kann. Ich würde vorschlagen, dass Sie Ihren Code ändern zu tun:

Thread[] threads = new Thread[6]; 

for (int i= 0; i < 6; i++) {   
    threads[i] = new Thread(new MyService(i)); 
} 
for (int i= 0; i < 6; i++){   
    threads[i].start(); 
} 

Auch sind Sie „KEY“ auf den Thread-Kontext hinzugefügt, aber das Entfernen „threadName“. Das wird Probleme verursachen. Ihr Beispiel oben hat auch keinen Logger-Aufruf. Ich nehme an, es sollte logger.info sein, nicht nur Info.

Verwandte Themen