繁体   English   中英

如何为每个log4j请求生成唯一的请求ID

[英]How to generate unique request id for each log4j request

我正在使用log4j打印请求和响应的日志。 我想为每个请求分配一个唯一的ID,并为它的响应分配相同的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

您可以考虑使用Context Map Lookup ,这是一个简单的示例:

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

希望对您有所帮助:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM