15

我正在将中型应用程序的日志记录从自定义解决方案迁移到更标准的解决方案。我决定使用 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()(与logger标准 Java 类中的静态字段相反)
  • 我认为记录器的名称也不会很简单

是否有某种标准、最佳实践或登录 JSP 的任何东西?

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

4

5 回答 5

9

看看slf4j-taglib

于 2009-08-12T06:41:28.263 回答
5

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

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

然后将您的 System.out 替换为

<% log.info("Hello Logging!"); %>

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

于 2009-08-11T08:50:39.593 回答
0
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!");
%>
于 2009-08-11T07:59:39.560 回答
0

要在 jsp 文件中使用 logger,请通过以下方式初始化 logger 对象:

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

然后你可以继续使用

logger.info(); or logger.error();, etc.
于 2013-08-08T07:21:55.693 回答
-1

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

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

于 2012-10-17T14:07:29.267 回答