【发布时间】: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记录其响应。此外,map和totalTime可能有同样的问题。 -
感谢您的回复,不,我没有在这里添加任何线程安全,我正在使用弹簧