Как использовать регистраторы SLF4J в JSP

Я выполняю миграцию регистрации приложения среднего размера из пользовательского решения в нечто более стандартное. Я решил использовать 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 был какой-то taglib. Есть ли что-то подобное для SLF4J (или, может быть, Logback)?

Ответы

Ответ 2

Вы можете попробовать (обратите внимание на "!" )

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

Затем замените System.out на

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

Комментарий Бориса действительно следует принимать во внимание, но JSPs не должны вообще регистрироваться. Я бы использовал эту технику (или что-нибудь подобное), чтобы заменить существующие записи, которые необходимо сохранить.

Ответ 3

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

Ответ 4

Чтобы использовать регистратор в файле jsp, инициализируйте объект журнала следующим образом:

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

И тогда вы можете продолжить, используя

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

Ответ 5

Я думаю, что плохая практика запускает ведение журнала с использованием репрезентативного уровня приложения. Как правило, я ожидал бы, что только поиск в бизнес-логике - JSP, загроможденный вызовом протоколирования, наверняка нарушит принцип разделения проблем.

Как временное, но изящное решение, вы можете попробовать создать пользовательский тег lib.