2010-05-06 68 views
3

我最近继承了2002年写回的J2EE Struts Web应用程序。除了奇怪的System.out.println()之外,没有在应用程序中进行日志记录。
我已经添加了log4j日志记录,以便我可以向控制台写出一些信息,但我很关心如何最好地处理这个问题。任何建议,技巧和最佳实践都会受到欢迎,因为我不想花费太多时间将日志记录添加到每个方法或类中(或试图找到日志记录最好的地方 - 即错误的代码块/缺陷)。
我目前的做法是只添加一些日志记录到我一直在寻找的几个类来理解代码,但是有几个关键的地方可以添加日志记录以最大化地使用添加log4j?如何实现log4j日志记录到现有的J2EE Struts Web应用程序?

编辑:
的最新进展:
我扩展了Struts(第1节)ExceptionHandler并配置了struts-config.xml使用我的CustomExceptionHandler而不是Struts的版本。然后通过重写​​方法,我添加了一些逻辑来使用log4j来记录异常。请看下图:

public class CustomExceptionHandler extends ExceptionHandler { 

static Logger logger = Logger.getLogger(CustomExceptionHandler.class); 

public ActionForward execute(Exception ex, ExceptionConfig ae, ActionMapping mapping, ActionForm formInstance, HttpServletRequest request, HttpServletResponse response) throws ServletException { 
    logException(ex); 
    return super.execute(ex, ae, mapping, formInstance, request, response); 
} 

private void logException(Throwable thr) { 
    // Add code here to log the exception appropiately 
    // i.e. logger.error("Exception is: " + ex.getMessage()); 
} 

的struts-config.xml文件必须被更新:

<global-exceptions>
<exception key="" type="java.lang.Throwable" handler="com.mycompany.CustomExceptionHandler" />
</global-exceptions>

现在我可以肯定,我会永远appropiately记录任何异常。
对于已越来越吃进去的例外,我包起来unchecked异常,让他们使其顶端:

 
} catch (Exception e) { 
//nothing here 
} 

更改为:

 
} catch (Exception e) { 
throw new RuntimeException(e); 
}

回答

2

最重要的事情是,我愿意在struts-config.xml中设置一个Struts异常处理程序,以捕捉从操作中抛出的所有内容并记录下来。然后,我会检查所有的异常处理,看看有什么异常被获取,写入标准输出,否则不会进入日志,并进行更改,以便每一个无法处理的异常都得到传播(包装在未选中状态如果有必要的话就会有异常),这样它就会将它传递给异常处理程序

除此之外,我会像你描述的那样,将记录添加到直接有用的部分。只要异常被抛出并且进入异常处理程序,就不应该做太多的事情。

+0

至于你的第一个建议,你的意思是这样的:<全球异常><例外键=“”类型=“java.lang.Throwable中的”处理程序=“com.mycompany.CustomHandler” /> Ruepen 2010-05-07 15:04:26

+0

是的,就像那样。有一个StrutsExceptionHandler是struts-1发行版的一部分,唯一错误的是它将所有内容记录为DEBUG。 – 2010-05-07 16:04:28

+0

当你说“必要时包装在非检查异常中”时,你的意思是: catch(IOException e){0} {0}抛出new RuntimeException(e); (例外e){ throw new RuntimeExcpetion(e); } 我在代码中看到,有不少如下: 赶上(例外五){// 这里没什么} 是 – Ruepen 2010-05-11 13:45:13

0

如果打算到System.out(System.err的)的唯一事情是旧记录和你正在寻找一个简单的解决方案,你总是可以重定向的System.out的包装类围绕一个记录器在启动您的应用程序的生命周期:

public class LoggerStream extends PrintStream { 
    Logger legacyLogger = Logger.getLogger("app.legacyLogger"); 

    ... 

    public void println(String s){ 
    legacyLogger.log(s); 
    } 
} 

覆盖任何其他方法,如打印等,这可能不会产生最漂亮的输出,但你可以使用它作为一个“快速修复”开始,然后取代传统的有更多记录适当的日志记录,因为您发现更感兴趣的项目

+0

@ M.Jessup - 感谢您的建议,但System.out似乎已在2005年加入,当有人需要在他们正在修复的类中看到一些输出时。它并不是普遍用于记录。我没有考虑过包装类,但我会在下一次记住它。 – Ruepen 2010-05-10 15:21:59

相关问题