首页 文章

如何在JSP中使用SLF4J Logger

提问于
浏览
14

我正在将中型应用程序的日志记录从自定义解决方案迁移到更标准的解决方案 . 我决定使用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 字段)

  • 我认为 Logger 的名称也不是那么简单

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

另外,IIRC,Log4J还有一些taglib . SLF4J(或者Logback)有类似的东西吗?

5 回答

  • -1

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

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

  • 9

    看看slf4j-taglib .

  • 0

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

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

    然后用 . 替换你的System.out

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

    尽管如此,鲍威斯的评论应该被认为是一致的,JSP应该不需要一般的日志记录 . 我只会使用这种技术(或任何类似的技术)来替换需要保留的现有日志记录 .

  • 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!");
    %>
    
  • 5

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

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

    然后你可以继续使用

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

相关问题