2017-10-05 297 views
0

我是log4j2的新手。以前我正在使用log4j。我正在遷移到第2部分的原因是異步日誌記錄。在搜索Internet後,我能夠編寫一個實際創建兩個日誌文件「Errors.log」和「Messages.log」的配置文件。現在的問題是:我將與遠離我的服務器進行通信。我寫了一個與服務器通信併發送請求的客戶端,服務器向我發送響應。在任何情況下,請求至少需要10毫秒才能到達服務器並獲取響應。但在我的日誌文件中,它顯示發送到服務器並從服務器接收的請求是同時(相同的毫秒)。我正在使用異步日誌記錄。這是否導致錯誤的時間戳?或者我所用的政策是造成這些問題?我的自定義Log4j2 XML配置文件中記錄時間不正確Java

下面是我Log4j2 XML配置文件:

<?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> 

任何人都可以請我的配置文件。我只需要創建兩個單獨的日誌文件,一個用於存儲信息消息,另一個用於存儲錯誤。這應該會在每次運行我的應用程序時創建一個新文件,並且它不應該刪除以前的日誌。日誌的大小可以是任何東西。如果大小已經超過,它應該創建一個新文件並將數據寫入它。無論運行應用程序多少天,日誌都需要存儲,整個過程必須以異步方式完成。

我也是用下面的VM選項用於異步日誌:

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

回答

1

登錄時是異步完成你的日誌信息到了一個單獨的隊列中。它們在後臺線程處理的時刻加上時間戳,後者將日誌寫入磁盤(因爲時間戳是你的一部分Appender模式)。所以只保留順序。時間戳可能略有不同。

有關更多信息,請參見https://logging.apache.org/log4j/2.x/manual/async.html