用Log4j很久了,一直没有好好的琢磨它。最近有个需求是这样的: 当用户操作导致异常发生的时候,要能够知道是那个用户在操作什么的时候导致了异常的发生。异常发生通常意味着给我们的customer带来不好的体验,如果我们能够知道是谁在experience它,我们的client service就可以跟进,通过email或者其他形式给用户一个合理的解释。毕竟,用户就是上帝嘛。:-)
这里我略过log4j的使用介绍,直接进入主题。想知道用户的信息很简单,我们一般会把用户的信息存放在session中,所以直接思路就是做一个Filter,在其中取到用户名和当前用户请求的URI。在webwork(Struts2)中,我们还想知道的更详细一点,就是当前执行的action的信息,于是我们需要一个Interceptor,在Interceptor中可以获知当前正在调用的Action的信息。然后是最重要的一点,我们需要把这个customized的信息添加到我们的log message 里面。
于是我想到了MDC(
org.apache.log4j.MDC), 它是一个ThreadLocal的Map, 所以可以保证我们存放在其中的customized信息不会混淆。它提供了static的put方法,于是我们如下操作:
- MDC.put("username",username);
- MDC.put("uri",uri);
- MDC.put("actionjName",actionName);
- ...
到了这里,剩下的工作就是把它展示出来了。让我们扩展一下某个Layout:
java 代码
- public class MyLayout extends Layout {
- StringBuffer sbuf = new StringBuffer(128);
- @Override
- public void activateOptions() {
- }
-
- @Override
- public String format(LoggingEvent event) {
- sbuf.setLength(0);
- sbuf.append(new Date(event.getStartTime()).toLocaleString()).append(LINE_SEP);
- sbuf.append("|username:").append(MDC.get("username")).append(" | ");
- sbuf.append("uri:").append(MDC.get("uri")).append(" |").append(LINE_SEP);
- sbuf.append(event.getLevel().toString());
- sbuf.append(" - ");
- sbuf.append(event.getRenderedMessage()).append(LINE_SEP);
- String[] strs = event.getThrowableStrRep();
- if(strs != null ) {
- for(String str: event.getThrowableStrRep()) {
- sbuf.append(str).append(LINE_SEP);
- }
- }
- sbuf.append(LINE_SEP);
- return sbuf.toString();
- }
-
- @Override
- public boolean ignoresThrowable() {
- return false;
- }
- }
Ok了,把log4j中你所用的Appender的layout设置成你自己的layout吧:
例如:
- log4j.appender.stdout.layout=com.jiny.learn.log.MyLayout
然后看看你的Log message, 是不是帅多了?
java 代码
- 2007-7-26 13:57:01
- |username:jiny | uri:/afterLogin | actionName: AfterLoginAction
- ERROR - I catched you!
- java.lang.Exception: TestException
- at com.jiny.learn.servlet.AfterLoginServlet.doProcess(AfterLoginServlet.java:14)
- at com.jiny.learn.servlet.BaseServlet.doGet(BaseServlet.java:24)
- at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
- at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
- at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:491)
- at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1074)
- at com.jiny.learn.log.LoggerContextFilter.doFilter(LoggerContextFilter.java:25)
- at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1065)
- at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:365)
- at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:185)
- at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
- at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:689)
- at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:391)
- at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
- at org.mortbay.jetty.Server.handle(Server.java:285)
- at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:457)
- at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:751)
- at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:500)
- at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:209)
- at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:357)
- at org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:217)
- at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:475)
分享到:
- 2007-07-26 18:57
- 浏览 1951
- 评论(0)
- 论坛回复 / 浏览 (0 / 2980)
- 查看更多
相关推荐
Building Tools with GitHub Customize Your Workflow 英文mobi 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
Building Tools with GitHub Customize Your Workflow 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,...
For your next project on GitHub, take advantage of the service’s powerful API to meet your unique development requirements. This practical guide shows you how to build your own software tools for ...
Customize your device with your preferences •3D carousel with special effects •Make your own Home screen using widgets •Adaptive skins •Change background •Customize your menu •Change widget ...
WordPress Complete_ set up, customize, and market your blog.pdf
Customize Rules 使用附件中的 myrules 中的内容覆盖 Customize 的内容然后保存
根据提供的文件信息,我们可以总结出以下关于《Microsoft Windows 7 Your Way: Speed Up and Customize Windows》一书的关键知识点: ### 书籍基本信息 - **书名**:Microsoft Windows 7 Your Way: Speed Up and ...
《前端开源库 Customize Engine Handlebars 深度解析》 在现代前端开发中,自定义引擎扮演着重要的角色,它们允许开发者根据特定需求定制化处理模板、数据和逻辑。其中,“customize-engine-handlebars”是一个专注...
By Michael Miller Windows 7 Your Way is all about customizing and optimizing Windows 7 on your computer system. Obviously, it covers all the new features of Windows 7
You can use it to customize Flume to your specific needs. There are pointers given on writing custom implementations as well that would help you learn and implement them. By the end, you should be ...
在压缩包中的`customize-tabwidget`文件可能是项目的主要源代码文件,包含实现上述功能的C++代码。开发者可能使用了Qt Creator作为IDE,编写了`.cpp`和`.h`文件,定义了自定义的`TabWidget`类,并在`main.cpp`中实例...
You can use it to customize Flume to your specific needs. There are pointers given on writing custom implementations as well that would help you learn and implement them. By the end, you should be ...
语言:English 选项:查看每天有多少已预订/已完成的会话,24小时制,仪表板上更大的文本大小等等 通过此扩展程序,您可以在Focusmate仪表板上自定义不同的查看选项。 有关更多详细信息,请参见屏幕截图。...
标题 "myeclipse_2014_customize_perspective修复bug" 指向的是一个针对MyEclipse 2014版本中自定义透视图(perspective)问题的修复工具包。MyEclipse是一款功能丰富的Java集成开发环境(IDE),它是Eclipse的商业...
然而,软件在使用过程中难免会出现一些问题,比如标题所提到的“不能启动Customize Perspective”就是一个常见的故障。本文将详细解析这个问题及其解决方案。 "Customize Perspective"是Eclipse和MyEclipse中的一个...
customize sort.txt
【标题】"前端开源库-customize"涉及到的核心概念是前端开发中的自定义化框架,它为开发者提供了一种创建可定制引擎的能力。在现代Web应用中,为了满足不同项目的需求和提升用户体验,开发者往往需要对现有的开源库...
5. **检查错误日志**:在“Window” -> “Show View” -> “Error Log”中查看错误信息,这些信息可能指向问题的具体原因。 6. **重新安装Myclipse**:作为最后的手段,你可以卸载并重新安装Myclipse。记得在卸载前...