我记录了所有传入我的servlet的请求参数。正在发生的情况是,请求参数是混合的。因为servlet在新线程中处理每个请求,所以我知道我的消息会被混淆。但是,我如何才能确保一个请求的所有参数都会打印出来,然后才会打印下一个请求的参数。
log4j.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Properties>
<Property name="log-path">../</Property>
</Properties>
<Appenders>
<RollingFile name="LogFile"
fileName="${log-path}/standalone/log/myApp/app.log"
filePattern="${log-path}/standalone/log/myApp/%d{yyyy}/%d{MM}/%d{yyyy-MM-dd}/app-%d{yyyy-MM-dd-HH}.log.gz">
<PatternLayout>
<pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c{1} - %msg%n
</pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1"
modulate="true" />
</Policies>
</RollingFile>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout
pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
</Console>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="Console" />
<AppenderRef ref="LogFile" />
</Root>
</Loggers>
代码:
logger.info("-----Request Details Begins-----");
logger.info("Client IP Address------> " + ipAddress);
logger.info("Requested Service------> " + url);
Enumeration<String> parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()) {
String paramName = parameterNames.nextElement();
String[] paramValues = request.getParameterValues(paramName);
for (int i = 0; i < paramValues.length; i++) {
String paramValue = paramValues[i];
if (dontLog(paramName)) {
paramValue = "XXXXXX";
} else if ("requestParams".equalsIgnoreCase(paramName)) {
//TODO dont log sensitive data
}
logger.info("Request " + paramName + " ------> " + paramValue);
}
}
logger.info("-----Request Details Ends-----");注意:我不想单行打印消息。
发布于 2018-11-06 15:41:40
日志消息被不同的线程混合在一起是预期的行为。如果您不想记录一行,只需要记录包含一个文本行分隔符的块。你总是需要用一条日志语句来记录你的“事件”。如果记录器是同步的,则应用程序的性能将显著降低。您的servlet能够为多个线程提供服务是一件好事--没有什么可以搞乱的。如果您使用非阻塞技术,您的non服务器将能够并行处理数万个请求。猜猜如果同步了日志语句会发生什么。长话短说:添加自己的换行符。;)
https://stackoverflow.com/questions/53167209
复制相似问题