如何在JSP中使用SLF4J Logger

时间:2009-08-11 07:00:30

标签: java jsp logging slf4j

我正在将中型应用程序的日志记录从自定义解决方案迁移到更标准的解决方案。我决定使用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有一些taglib。是否有类似的SLF4J(或者可能是Logback)?

5 个答案:

答案 0 :(得分:9)

看看slf4j-taglib

答案 1 :(得分:5)

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

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

然后用

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

鲍里斯的评论应该真正考虑到一致,但JSP一般不需要登录。我只会使用这种技术(或任何类似的技术)来替换需要保留的现有日志记录。

答案 2 :(得分: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!");
%>

答案 3 :(得分:0)

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

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

然后你可以继续使用

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

答案 4 :(得分:-1)

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

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