2017-10-05 2 views
0

Ich bin neu in Log4j2. Zuvor verwende ich log4j. Der Grund für die Migration in Teil 2 liegt in der asynchronen Protokollierung. Nach der Suche im Internet kann ich eine Konfigurationsdatei schreiben, die zwei Protokolldateien "Errors.log" und "Messages.log" erstellt. Jetzt ist das Problem: Ich würde mit Servern kommunizieren, die weit von mir entfernt sind. Ich schrieb einen Client, der mit dem Server kommuniziert und eine Anfrage sendet und im Gegenzug sendet mir der Server eine Antwort. In jeder Situation dauert es mindestens 10 Millisekunden, bis die Anfrage den Server erreicht und die Antwort zurückbekommt. Aber in meinen Protokolldateien zeigt es, dass die Anfrage, die an den Server gesendet wird und vom Server empfangen wird, zur gleichen Zeit ist (dieselbe Millisekunde). Ich verwende die asynchrone Protokollierung. Verursacht dies den falschen Zeitstempel? Oder schaffen die Richtlinien, die ich verwendet habe, diese Probleme?Logging Zeit falsch in meiner benutzerdefinierten Log4j2 XML-Konfigurationsdatei Java

Unten ist meine Log4j2 XML-Konfigurationsdatei:

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="warn"> 
    <Appenders> 
    <File name="my_file_appender" fileName="LOG4j_LOGS/Errors.log" immediateFlush="false" append="false"> 
     <PatternLayout> 
     <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - %msg%n</Pattern> 
     </PatternLayout> 
    </File> 
    <Async name="async_appender"> 
    <AppenderRef ref="my_file_appender" /> 
    </Async> 
    <!-- file appender --> 
    <RollingFile name="Error-log" fileName="LOG4j_LOGS/Messages.log" 
       filePattern="LOG4j_LOGS/Messages-%d{yyyy-MM-dd}.log"> 
     <!-- log pattern --> 
     <PatternLayout> 
      <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - %msg%n</Pattern> 
     </PatternLayout> 
     <!-- set file size policy --> 
     <Policies> 
      <TimeBasedTriggeringPolicy /> 
      <SizeBasedTriggeringPolicy size="100 MB" /> 
     </Policies> 
     <DefaultRolloverStrategy max="25"/> 
    </RollingFile> 
    </Appenders> 
    <Loggers> 
     <Logger name="Error-log" level="info" additivity="false"> 
     <appender-ref ref="Error-log" level="debug"/> 
     </Logger> 
     <Root level="info" includeLocation="false"> 
      <AppenderRef ref="async_appender"/> 
     </Root> 
    </Loggers> 
</Configuration> 

Kann jemand bitte meine Config-Datei überprüfen. Alles, was ich will, ist zwei separate Protokolldateien zu erstellen, eine zum Speichern von Nachrichten und andere zum Speichern von Fehlern. Und das sollte eine neue Datei jedes Mal erstellen, wenn ich meine Anwendung ausführe und die vorherigen Protokolle nicht löschen sollte. Die Größe der Protokolle kann alles sein. Wenn die Größe überschritten wurde, sollte eine neue Datei erstellt und die Daten in die Datei geschrieben werden. Unabhängig davon, wie viele Tage ich die Anwendung verwende, müssen die täglichen Protokolle gespeichert werden und der gesamte Prozess muss asynchron durchgeführt werden.

Ich verwende auch die folgenden VM-Optionen für die Protokollierung asynchron:

-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector 

Antwort

1

Beim Anmelden asynchron Sie Nachrichten erfolgt auf einer separaten Warteschlange einzuloggen bekam. Sie sind zum Zeitpunkt der Verarbeitung durch einen Hintergrund-Thread mit Zeitstempel versehen, der die Protokolle auf die Festplatte schreibt (da der Zeitstempel Teil des Appender-Musters ist). So bleibt nur die Reihenfolge erhalten. Zeitstempel können geringfügig abweichen.

Weitere Informationen finden Sie unter https://logging.apache.org/log4j/2.x/manual/async.html.