2017-03-29 157 views
0

我使用log4j打印請求和響應的日誌。我想爲每個請求分配一個唯一的ID併爲其響應分配相同的ID,但有多個請求,因此我可以更容易地識別每個請求和響應。如何爲每個log4j請求生成唯一的請求ID

這是我正在使用,但它不工作。它也在響應中更新UDID。

public void logRequestObject(HttpServletRequest httprequest){ 
    uniqueID= UUID.randomUUID().toString();   
    logger.info("Log4J - "+ "Request: requestId= "+ uniqueID+ ",Headers= "+ map); 
} 

    public void logResponseObject(HttpServletResponse httpResponse){  
     logger.info("Log4J - "+ "Response: ,requestId= " + uniqueID + " ,responseTime= " + " totalTime= "+ totalTime);   
} 

然後我才知道log4j提供了一種方法來記錄每個請求的唯一ID。

我已經閱讀了很多帖子在stackoverflow,但仍然無法理解它。

這是我的properties文件。

# Root logger option 
log4j.rootLogger=INFO, stdout, file, CATALINA 

# Catalina 

    log4j.appender.CATALINA=org.apache.log4j.RollingFileAppender 
    log4j.appender.CATALINA.File=${catalina.home}/logs/catalina.out 
    log4j.appender.CATALINA.MaxFileSize=10MB 
    log4j.appender.CATALINA.MaxBackupIndex=5 
    log4j.appender.CATALINA.layout=org.apache.log4j.PatternLayout 
    log4j.appender.CATALINA.layout.ConversionPattern=%d{dd.MM.yyyy HH:mm:ss} %X{RequestId} %p-%c{1}: [%m]%n 
    log4j.appender.CATALINA.Append=true 
    log4j.appender.CATALINA.Encoding=UTF-8 
+0

是否存在'uniqueID'線程安全的類?只是猜測發生了什麼:線程1爲'uniqueID'分配一個值並記錄請求。在線程1記錄響應之前,線程2爲'uniqueID'分配一個新值(並記錄它的請求)。然後,線程1使用'uniqueID'記錄它的響應,這個'uniqueID'被分配了一個來自線程2的新值。另外,'map'和'totalTime'可能有相同的問題。 –

+0

感謝您的回覆,並且我沒有在此處添加任何線程,我正在使用spring – Kirmani88

回答

1

您可以考慮使用語境地圖查找,這裏有一個簡單的例子:

Java代碼sinppet:

public static void main(String[] args) { 
    String uuid = "1"; 
    logRequestObject("http request", uuid); 
    logResponseObject("http response"); 

    uuid = "2"; 
    logRequestObject("http request", uuid); 
    logResponseObject("http response"); 
} 

static void logRequestObject(Object httpRequest, String uniqueID) { 
    ThreadContext.put("uniqueID", uniqueID); // Update uniqueID before logging request and response 
    logger.info("This is {}", httpRequest); 
} 

static void logResponseObject(Object httpResponse) { 
    logger.info("This is {}", httpResponse); 
} 

的log4j.xml

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration> 
    <Appenders> 
     <Console name="STDOUT" target="SYSTEM_OUT"> 
      <PatternLayout pattern='%level -> %msg %X{uniqueID}%n'/> <!-- Get uniqueID from ThreadContext --> 
     </Console> 
    </Appenders> 

    <Loggers> 
     <Root level="DEBUG"> 
      <AppenderRef ref="STDOUT"/> 
     </Root> 
    </Loggers> 
</Configuration> 

輸出

INFO -> This is http request 1 
INFO -> This is http response 1 
INFO -> This is http request 2 
INFO -> This is http response 2 

我希望它有幫助:)