2017-03-29 44 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は、スレッド2から新しい値が割り当てられた 'uniqueID'を使って応答を記録します。また、' map'と 'totalTime'も同じ問題があります。 –

+0

返信いただきありがとうございます。いいえ、私はここに安全なスレッドを追加していない、私は春を使用しています – 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 

私は助けてくれるといいでしょう:)

関連する問題