【问题标题】:How can I implement log4j logging to an existing J2EE Struts web application?如何将 log4j 日志记录到现有的 J2EE Struts Web 应用程序?
【发布时间】:2010-05-06 13:25:12
【问题描述】:

我最近继承了一个 2002 年编写的 J2EE Struts Web 应用程序。除了奇怪的 System.out.println() 之外,该应用程序没有任何日志记录。
我添加了 log4j 日志记录,以便我可以将一些信息写入控制台,但我担心如何最好地解决这个问题。任何建议、提示、最佳实践都将受到欢迎,因为我不想花太多时间向每个方法或类添加日志记录(或试图找到最好的日志记录位置 - 即错误的代码块/缺陷)。
我目前的方法是在我一直在寻找的几个类中添加一些日志记录以理解代码,但是有几个关键的地方我可以添加日志记录以最大限度地利用添加 log4j?

编辑:
进度更新:
我扩展了 Struts (v.1) ExceptionHandler 并将 struts-config.xml 配置为使用我的 CustomExceptionHandler 而不是 Struts 版本。然后通过覆盖execute() 方法,我添加了一些逻辑来使用log4j 记录异常。见下文:

公共类 CustomExceptionHandler 扩展 ExceptionHandler {

 静态 Logger logger = Logger.getLogger(CustomExceptionHandler.class);

 公共 ActionForward 执行(异常 ex,E​​xceptionConfig ae,ActionMapping 映射,ActionForm formInstance,HttpServletRequest 请求,HttpServletResponse 响应)抛出 ServletException {
  日志异常(前);
  return super.execute(ex, ae, mapping, formInstance, request, response);
 }

 私人无效日志异常(Throwable thr){
   // 在此处添加代码以适当地记录异常
   // 即 logger.error("异常是:" + ex.getMessage());
}

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

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

现在我可以确定我将始终适当地记录任何异常。
对于被吃掉的异常,我将它们包装在未经检查的异常中,以便它们到达顶部:

} 捕捉(异常 e){ //这里没有什么 }

改为:

} 捕捉(异常 e){ 抛出新的 RuntimeException(e); }

【问题讨论】:

    标签: java struts log4j legacy


    【解决方案1】:

    最重要的是,我会在 struts-config.xml 中设置一个 Struts 异常处理程序,以捕获从操作中抛出的所有内容并记录下来。然后我会检查所有异常处理,看看哪些异常被吃掉、写入标准输出,或者没有进入日志,并进行更改,以便每个无法有效处理的异常都被传播(包装在 unchecked必要时例外),以便它进入异常处理程序。

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

    【讨论】:

    • 关于你的第一个建议,你的意思是: 。 CustomHandler 覆盖执行方法。在执行方法中,我添加了一个方法 logException(Throwable t){},然后在记录异常后调用 super.execute()。
    • 是的,类似的。 StrutsExceptionHandler 是 struts-1 发行版的一部分,唯一的问题是它将所有内容都记录为 DEBUG。
    • 当你说“必要时包装在未经检查的异常中”时,你的意思是:catch (IOException e){ throw new RuntimeException(e); } catch (Exception e) { throw new RuntimeExcpetion (e);我在代码中看到有很多以下内容:catch (Exception e) { //nothing here }
    • 是的,你看到异常被吃掉了。您的 sn-p 将原始异常传递给 RuntimeException 的构造函数可确保原始信息不会丢失。
    【解决方案2】:

    如果唯一要访问 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);
      }
    }
    

    覆盖任何其他方法,如 print 等。它可能不会生成最漂亮的输出,但您可以将其用作“快速修复”开始,然后在您发现更感兴趣的项目时用更合适的日志替换旧日志.

    【讨论】:

    • @M.Jessup - 感谢您的建议,但 System.out 似乎已在 2005 年添加,当时有人需要查看他们正在修复的类中的一些输出。它没有被广泛用于日志记录。我没有考虑过包装类,但下次我会记住的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 2016-02-26
    • 2020-12-07
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    相关资源
    最近更新 更多