2009-08-11 44 views
13

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

<%@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)?

回答

9

看一看slf4j-taglib

+2

据我所知,slf4j-taglib并没有成为maven的核心。对于任何人来说,这可能是一个挂断。 – 2012-08-06 14:34:10

+0

它还没有! – 2013-09-17 14:14:22

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!"); 
%> 
+0

先走,我不认为这是任何更好。这样,每次我想记录某些内容时,我都必须调用getLogger(),但是存在线程安全问题,这比原始解决方案更加冗长。 – 2009-08-11 08:05:30

+1

您可以使用面向方面编程技术来包装标记库执行的Java方法调用,并在每次执行之前和之后进行日志记录。无论如何,JSP不是业务逻辑的地方。它应该在JAVA控制器和模型部件中。 – 2009-08-11 08:29:34

5

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

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

然后用

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

鲍里斯的评论应该真的采取尽管如此,JSPs通常不需要日志记录。我只会使用这种技术(或类似的任何东西)来替换需要保留的现有日志记录。

-1

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

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

0

要在JSP文件中使用记录仪,初始化记录器对象以下列方式:

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

然后,你可以通过使用

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