【问题标题】:How to generate unique request id for each log4j request如何为每个 log4j 请求生成唯一的请求 ID
【发布时间】:2017-03-29 15:21:31
【问题描述】:

我正在使用 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

【问题讨论】:

  • 持有uniqueID 线程的类是否安全?只是猜测发生了什么:线程 1 为 uniqueID 分配一个值并记录请求。在线程 1 记录之前,响应线程 2 为 uniqueID 分配一个新值(并记录其请求)。然后线程 1 使用从线程 2 分配的新值 uniqueID 记录其响应。此外,maptotalTime 可能有同样的问题。
  • 感谢您的回复,不,我没有在这里添加任何线程安全,我正在使用弹簧

标签: java logging log4j log4j2


【解决方案1】:

你可以考虑使用Context Map Lookup,下面是一个简单的例子:

Java 代码片段:

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

希望对你有帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 2023-03-06
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多