我记录了所有到达我的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-----");
注意:我不想单行打印消息。
答案 0 :(得分:0)
预计日志消息会被不同的线程混淆。如果您不想记录一行,只需记录一个文本块-包括换行符。您始终必须用一个log语句记录“事件”。如果记录器将被同步,则应用程序的性能将急剧下降。 Servlet的服务多个线程的能力是一件好事-没什么可麻烦的。如果您使用非阻塞技术,则您的Web服务器将能够并行处理成千上万的请求。猜测一下如果同步日志语句会发生什么。 长话短说:添加行打破了自己。 ;)