`
manyinjin
  • 浏览: 92257 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Customize your log message

阅读更多
        用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方法,于是我们如下操作:
 
  1. MDC.put("username",username);  
  2. MDC.put("uri",uri);  
  3. MDC.put("actionjName",actionName);  
  4. ...  
       到了这里,剩下的工作就是把它展示出来了。让我们扩展一下某个Layout:
java 代码
 
  1. public class MyLayout extends Layout {  
  2.     StringBuffer sbuf = new StringBuffer(128);  
  3.     @Override  
  4.     public void activateOptions() {  
  5.     }  
  6.   
  7.     @Override  
  8.     public String format(LoggingEvent event) {  
  9.         sbuf.setLength(0);  
  10.         sbuf.append(new Date(event.getStartTime()).toLocaleString()).append(LINE_SEP);  
  11.         sbuf.append("|username:").append(MDC.get("username")).append(" | ");  
  12.         sbuf.append("uri:").append(MDC.get("uri")).append(" |").append(LINE_SEP);  
  13.         sbuf.append(event.getLevel().toString());  
  14.         sbuf.append(" - ");  
  15.         sbuf.append(event.getRenderedMessage()).append(LINE_SEP);  
  16.         String[] strs = event.getThrowableStrRep();  
  17.         if(strs != null ) {  
  18.             for(String str: event.getThrowableStrRep()) {  
  19.                 sbuf.append(str).append(LINE_SEP);  
  20.             }  
  21.         }  
  22.         sbuf.append(LINE_SEP);  
  23.         return sbuf.toString();  
  24.     }  
  25.   
  26.     @Override  
  27.     public boolean ignoresThrowable() {  
  28.         return false;  
  29.     }  
  30. }  
Ok了,把log4j中你所用的Appender的layout设置成你自己的layout吧:
例如:
  1. log4j.appender.stdout.layout=com.jiny.learn.log.MyLayout  

        然后看看你的Log message, 是不是帅多了?
java 代码
 
  1. 2007-7-26 13:57:01  
  2. |username:jiny | uri:/afterLogin |  actionName: AfterLoginAction
  3. ERROR - I catched you!  
  4. java.lang.Exception: TestException  
  5. at com.jiny.learn.servlet.AfterLoginServlet.doProcess(AfterLoginServlet.java:14)  
  6. at com.jiny.learn.servlet.BaseServlet.doGet(BaseServlet.java:24)  
  7. at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)  
  8. at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)  
  9. at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:491)  
  10. at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1074)  
  11. at com.jiny.learn.log.LoggerContextFilter.doFilter(LoggerContextFilter.java:25)  
  12. at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1065)  
  13. at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:365)  
  14. at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:185)  
  15. at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)  
  16. at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:689)  
  17. at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:391)  
  18. at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)  
  19. at org.mortbay.jetty.Server.handle(Server.java:285)  
  20. at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:457)  
  21. at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:751)  
  22. at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:500)  
  23. at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:209)  
  24. at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:357)  
  25. at org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:217)  
  26. at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:475)  
分享到:
评论

相关推荐

    Building Tools with GitHub Customize Your Workflow mobi

    Building Tools with GitHub Customize Your Workflow 英文mobi 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

    Building Tools with GitHub Customize Your Workflow 无水印pdf

    Building Tools with GitHub Customize Your Workflow 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,...

    Building.Tools.with.GitHub.Customize.Your.Workflow.epub

    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 ...

    SPB Software SPB Mobile Shell v3.05.295 S60v5 Symbian OS9.4 Unsigned Cracked

    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

    WordPress Complete_ set up, customize, and market your blog.pdf

    Customize Rules 使用 myrules

    Customize Rules 使用附件中的 myrules 中的内容覆盖 Customize 的内容然后保存

    (英文)Microsoft Windows 7 Your Way: Speed Up and Customize Window

    根据提供的文件信息,我们可以总结出以下关于《Microsoft Windows 7 Your Way: Speed Up and Customize Windows》一书的关键知识点: ### 书籍基本信息 - **书名**:Microsoft Windows 7 Your Way: Speed Up and ...

    前端开源库-customize-engine-handlebars

    《前端开源库 Customize Engine Handlebars 深度解析》 在现代前端开发中,自定义引擎扮演着重要的角色,它们允许开发者根据特定需求定制化处理模板、数据和逻辑。其中,“customize-engine-handlebars”是一个专注...

    Windows 7 Your Way Speed Up and Customize Windows

    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

    Apache Flume Distributed Log Collection For Hadoop

    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.zip

    在压缩包中的`customize-tabwidget`文件可能是项目的主要源代码文件,包含实现上述功能的C++代码。开发者可能使用了Qt Creator作为IDE,编写了`.cpp`和`.h`文件,定义了自定义的`TabWidget`类,并在`main.cpp`中实例...

    Apache Flume- Distributed Log Collection for Hadoop(PACKT,2013)

    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 ...

    Focusmate - Customize Your Dashboard-crx插件

    语言:English 选项:查看每天有多少已预订/已完成的会话,24小时制,仪表板上更大的文本大小等等 通过此扩展程序,您可以在Focusmate仪表板上自定义不同的查看选项。 有关更多详细信息,请参见屏幕截图。...

    myeclipse_2014_customize_perspective修复bug

    标题 "myeclipse_2014_customize_perspective修复bug" 指向的是一个针对MyEclipse 2014版本中自定义透视图(perspective)问题的修复工具包。MyEclipse是一款功能丰富的Java集成开发环境(IDE),它是Eclipse的商业...

    解决myeclipse2014版本中不能启动customize perspective的替换补丁

    然而,软件在使用过程中难免会出现一些问题,比如标题所提到的“不能启动Customize Perspective”就是一个常见的故障。本文将详细解析这个问题及其解决方案。 "Customize Perspective"是Eclipse和MyEclipse中的一个...

    customize sort.txt

    customize sort.txt

    前端开源库-customize

    【标题】"前端开源库-customize"涉及到的核心概念是前端开发中的自定义化框架,它为开发者提供了一种创建可定制引擎的能力。在现代Web应用中,为了满足不同项目的需求和提升用户体验,开发者往往需要对现有的开源库...

    Myclipse2014 Customize Persperctive失效解决方案

    5. **检查错误日志**:在“Window” -> “Show View” -> “Error Log”中查看错误信息,这些信息可能指向问题的具体原因。 6. **重新安装Myclipse**:作为最后的手段,你可以卸载并重新安装Myclipse。记得在卸载前...

Global site tag (gtag.js) - Google Analytics