是否可以自定义 WebSphere 访问日志(通过代码或配置)?我在控制台中看到 WebSphere 支持 NCSA 通用格式或组合格式,但没有自定义格式的选项。
我希望自定义访问日志以包含有助于调试的附加信息,例如代理、vip、LB、响应时间等。
如果不可能,我愿意接受开箱即用的想法。关键是我正在尝试记录其他信息以进行调试。log4j 是一个选项吗?也许自定义跟踪日志?
是否可以自定义 WebSphere 访问日志(通过代码或配置)?我在控制台中看到 WebSphere 支持 NCSA 通用格式或组合格式,但没有自定义格式的选项。
我希望自定义访问日志以包含有助于调试的附加信息,例如代理、vip、LB、响应时间等。
如果不可能,我愿意接受开箱即用的想法。关键是我正在尝试记录其他信息以进行调试。log4j 是一个选项吗?也许自定义跟踪日志?
您可以做的一件事是在 WAS 中设置一个 Web 服务器IBM 有一个 HTTP 服务器,它只包装 Apache,这可能会让您不那么头疼,或者您可以使用 Apache、IIS 等。
配置完成后,您应该能够安装所需的 Apache 模块来处理自定义日志记录。它的工作原理是网络服务器充当您实际应用程序服务器的前端,并将请求传递给它。
自定义访问日志可用于 WAS 8.0.0.2 及更高版本。
当您对新想法持开放态度时,您可以激活 servlet 的请求度量工具,如本博客条目中所述
可以在管理控制台的 Monitoring and Tuning > Request Metrics 下启用请求指标。无需重新启动服务器即可使请求指标开始工作。
- 确保选中“为请求指标收集准备服务器”
- 为“要检测的组件”选择“自定义”,然后选择“Servlet”
- 将“跟踪级别”设置为“啤酒花”
- 检查“标准日志”
为每个请求记录的信息采用这种格式
[9/26/11 15:43:45:448 PDT] 00000027 PmiRmArmWrapp I PMRM0003I: parent:ver=1,ip=10.20.30.8,time=1317075586068,pid=32507,reqid=1,event=1 - current:ver=1,ip=10.20.30.8,time=1317075586068,pid=32507,reqid=1,event=1 type=URI detail=/swat/Sleep elapsed=1004
该elapsed
字段是以毫秒为单位的响应时间。
一种实用的方法是创建您自己的自定义请求记录器实现。您可以使用带有标准 Servlet API ServletRequestListener 的 WAS 功能“全局 Web 容器侦听器”来执行此操作。
这是一个伪示例:
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
public class HttpServletRequestRequestListener implements ServletRequestListener {
ThreadLocal<Long> threadLocal = new ThreadLocal<Long>();
@Override
public void requestDestroyed(ServletRequestEvent aArg0) {
HttpServletRequest tHttpServletRequest = getHttpServletRequest(aArg0.getServletRequest());
if(tHttpServletRequest != null){
Long tStart = threadLocal.get();
long tCallDelay = -1;
if(tStart != null){
tCallDelay = System.currentTimeMillis() - tStart.longValue();
}
//In this class I will log the request including cookies etc.
// in my own customized format...
MyCustomLogger.log(tHttpServletRequest,tCallDelay);
}
}
@Override
public void requestInitialized(ServletRequestEvent aArg0) {
long tStart = System.currentTimeMillis();
threadLocal.set(tStart);
}
private static HttpServletRequest getHttpServletRequest(ServletRequest aServletRequest) {
if (aServletRequest instanceof HttpServletRequest) {
return (HttpServletRequest) aServletRequest;
}
return null;
}
}
此外,在 webcontainer 自定义属性中,您应该使用 listeners 属性指向您的侦听器。
以下是有关如何配置 Web 容器侦听器的更多信息:http://pic.dhe.ibm.com/infocenter/wasinfo/v6r1/index.jsp? topic =%2Fcom.ibm.websphere.base.doc%2Finfo%2Faes %2Fae%2Frweb_custom_props.html