【问题标题】:How to use SLF4J Loggers in a JSP如何在 JSP 中使用 SLF4J 记录器
【发布时间】:2010-11-18 12:44:02
【问题描述】:

我正在将中型应用程序的日志记录从自定义解决方案迁移到更标准的解决方案。我决定使用 Logback 和 SLF4J,并且我已经成功迁移了大部分 Java 代码。但是,我有相当多的 JSP 只是使用 System.out 进行日志记录。我从来没有过多地使用过 JSP,并开始思考:我应该如何在 JSP 中使用正确的日志记录?

<%@page import="org.slf4j.Logger"%>
<%@page import="org.slf4j.LoggerFactory"%>
<%
    Logger log = LoggerFactory.getLogger(getClass());
%>
<!-- ... -->
<%
    log.info("Hello Logging!");
%>

这是首先想到的,但在几点上似乎是错误的:

  • 过于冗长,需要大量工作才能转换现有的 JSP
  • 每次呈现页面时都会调用 LoggerFactory.getLogger()(与标准 Java 类中的静态 logger 字段相反)
  • 我认为记录器的名称也不会这么直接

是否有某种标准、最佳实践或任何用于登录 JSP 的方法?

另外,IIRC,Log4J 有某种标记库。 SLF4J(或者可能是 Logback)有类似的东西吗?

【问题讨论】:

    标签: java jsp logging slf4j


    【解决方案1】:

    看看slf4j-taglib

    【讨论】:

    • 据我所知,slf4j-taglib 还没有进入 maven central。对于可能会挂断的任何人,仅供参考。
    【解决方案2】:

    你可以试试(注意“!”)

    <%! org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger("JSPname"); %>
    

    然后用

    替换你的 System.out
    <% log.info("Hello Logging!"); %>
    

    Boris 的评论确实应该考虑在内,JSP 通常不需要登录。我只会使用这种技术(或任何类似技术)来替换需要保留的现有日志记录。

    【讨论】:

      【解决方案3】:
      public enum MyLoggerFactory {
      
          INSTANCE;
      
          @SuppressWarnings("unchecked")
          private final Map<Class, Logger> loggers = new HashMap<Class, Logger>();
      
          @SuppressWarnings("unchecked")
          public Logger getLogger(Class clazz) {
              if (loggers.get(clazz) == null) {
                  loggers.put(clazz, LoggerFactory.getLogger(clazz));
              }
              return loggers.get(clazz);
          }
      }
      

      那么您的 JSP 页面可能如下所示:

      <%
          MyLoggerFactory.INSTANCE.getLogger(getClass()).info("Hello Logging!");
      %>
      

      【讨论】:

      • 我不认为这会更好。这样,每次我想记录一些东西时,我都必须调用 getLogger(),存在线程安全问题,这比原来的解决方案更加冗长。
      • 您可以使用面向方面的编程技术来包装您的标记库所做的 Java 方法调用,并在每次执行之前和之后记录下来。无论如何,JSP 不是业务逻辑的地方。它应该在 JAVA 控制器和模型部件中。
      【解决方案4】:

      要在jsp文件中使用logger,初始化logger对象的方式如下:

      <% Logger logger = LoggerFactory.getLogger(this.getClass()); %>
      

      然后你可以继续使用

      logger.info(); or logger.error();, etc.
      

      【讨论】:

        【解决方案5】:

        我认为从应用程序的表示层触发日志记录是一种不好的做法。一般来说,我希望只在业务逻辑中找到日志记录——一个杂乱无章的日志调用的 JSP 肯定会破坏关注点分离原则。

        作为一种临时但优雅的解决方法,您可以尝试创建一个自定义标签库。

        【讨论】:

          猜你喜欢
          • 2021-10-27
          • 2018-07-31
          • 2012-10-08
          • 1970-01-01
          • 1970-01-01
          • 2021-11-12
          • 1970-01-01
          • 2021-04-30
          • 1970-01-01
          相关资源
          最近更新 更多