Java 如何在JSP中使用SLF4J记录器

Java 如何在JSP中使用SLF4J记录器,java,jsp,logging,slf4j,Java,Jsp,Logging,Slf4j,我正在将中型应用程序的日志记录从定制解决方案迁移到更标准的解决方案。我已经决定使用Logback和SLF4J,并且已经成功地迁移了大部分Java代码。然而,我有相当多的JSP只使用System.out进行日志记录。我从来没有在JSP上做过很多工作,开始思考:我应该如何在JSP中使用正确的日志记录 <%@page import="org.slf4j.Logger"%> <%@page import="org.slf4j.LoggerFactory"%> <%

我正在将中型应用程序的日志记录从定制解决方案迁移到更标准的解决方案。我已经决定使用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)?

公共枚举MyLoggerFactory{
实例;
@抑制警告(“未选中”)
私有最终映射记录器=新HashMap();
@抑制警告(“未选中”)
公共记录器getLogger(clazz类){
if(loggers.get(clazz)==null){
loggers.put(clazz,LoggerFactory.getLogger(clazz));
}
返回loggers.get(clazz);
}
}
然后,您的JSP页面可能如下所示:

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

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


然后更换你的系统。用

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


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

看一看

我认为从应用程序的表示层触发日志记录是不好的做法。通常,我只希望在业务逻辑中找到日志记录——一个充斥着日志记录调用的JSP肯定会打破关注点分离原则


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

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

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

我不认为这更好。这样,每当我想记录一些东西时,我就必须调用getLogger(),因为存在线程安全问题,这比原始解决方案更加详细。您可以使用面向方面的编程技术来包装标记库所做的Java方法调用,并在每次执行之前和之后记录。无论如何,JSP不是用于业务逻辑的地方。就我所见,slf4j taglib还没有进入maven central。这只是给任何人的一个参考,这可能是一个障碍。
<% log.info("Hello Logging!"); %>
<% Logger logger = LoggerFactory.getLogger(this.getClass()); %>
logger.info(); or logger.error();, etc.