Подтвердить что ты не робот

Как правильно использовать log4j в jsp-страницах

Я имею в виду, я хочу, чтобы имя регистратора отражало файл source.jsp, независимо от того, включен ли он в другой файл или скомпилирован в класс или что-то еще.

4b9b3361

Ответ 1

Что случилось с:

Logger logger = Logger.getLogger( "source.jsp" );

Конечно, вы можете добавить его с лучшим недвусмысленным префиксом. На самом деле, что-то вдоль линий JSPS.source.jsp лучше, так как вы можете настроить правила ведения журнала для JSPS logger, которые позже будут применены ко всем суб-регистраторам.

Сказав это, зачем вам нужно напрямую регистрироваться в JSP?

Ответ 2

Во-первых, импортируйте требуемый пакет i.e.

<%@page import="org.apache.log4j.Logger"%>

то

 <%! static Logger logger = Logger.getLogger(jsppagename_jsp.class); %>

jsppagename_jsp может измениться в зависимости от сервера, который вы используете. И затем, используйте где-нибудь внутри jsp, например:

<% logger.info("This is test."); %>

В объявлении IDE может появиться сообщение об ошибке при объявлении объекта журнала. Но, не волнуйтесь, сервер, такой как tomcat, автоматически создаст соответствующий класс сервлета каждой страницы jsp внутри tomcat непосредственно.

Ответ 3

Вы можете написать метод factory, который принимает текущий запрос в качестве параметра и который получает Logger, основанный на имени JSP, примерно так:

public static Logger getLogger(HttpServletRequest request) {
    String requestUri = request.getRequestURI();
    String jspName = requestUri.substring(requestUri.lastIndexOf('/'));
    return Logger.getLogger(jspName);
}

Возможно, вам придется немного поиграть с ним, чтобы он работал (я не тестировал вышеприведенный код), но это его суть.

Это можно использовать непосредственно из JSP или из класса bean или тега, который используется JSP, если у него есть доступ к объекту запроса.

Ответ 4

Ниже приведен код. Все расположение и конфигурация файла конфигурации такие же, как и в сервлете или другом классе.

<%@ page import="org.apache.log4j.Logger" %>
<html>
    <head>
        <title>Demonstration log4j usage in jsp</title>
    </head>
    <body>
        <% Logger log = Logger.getLogger("com.mobilefish.demo.test");
           log.debug("Show DEBUG message");
           log.info("Show INFO message");
           log.warn("Show WARN message");
           log.error("Show ERROR message");
           log.fatal("Show FATAL message"); %>
        <b>The log messages are shown in the Tomcat console and in the ${catalina.home}/logs/demo.log file.</b>
    </body>
</html>

Ответ 5

При настройке log4j используйте ConversionPattern, например:

%d [%C] %-5p %c - %m%n

Здесь% C выводит полное имя класса при вызове любого из методов класса Logger.

Ответ 6

Так как вполне вероятно, что вы хотите вывести содержимое jsp-el-переменных в log4net, вы можете использовать этот код

<%@page import="org.apache.log4j.Logger"%>

<%-- output of the jsp-el variables "orderID" and "orderDate" in log4j --%>
<c:set var="Parameter4Log4J" value="orderID=${orderID} orderDate=${orderDate}" />
<% Logger.getLogger("jsp.order.orderconfirmation").info(
               pageContext.getAttribute("Parameter4Log4J")); %> 

Ответ 7

Хотя старый вопрос, я хотел бы предоставить некоторые варианты. Скажем jsp filename = for_example.jsp:

1. Используйте имя файла напрямую, но замените точку символом подчеркивания

Logger log = Logger.getLogger("for_example_jsp");

(обратите внимание: постоянно ошибка заключается в том, чтобы использовать "for_example.jsp" напрямую, он будет рассматриваться как имя класса, а затем, когда сервер AP, скажем, Tomcat, не найдет такого пути класса, он выведет сообщение журнала в catalina.out как "... (jsp)....".

2. Использовать URI запроса

Logger log = Logger.getLogger(request.getRequestURI());

Кому-то это нравится. Я не знаю, почему, но я видел это раньше в чьих-то кодах.

3. Использовать имя класса

Logger log = Logger.getLogger(this.getClass());

обычно это будет "for_example_jsp", за исключением случаев, когда for_example.jsp включен в какой-либо другой сервлет, например "test_servlet", он будет "включая имя файла журнала" + "порядковый номер", например test_servlet_include_005.

4. Программно получить имя файла jsp

String __jspName = this.getClass().getSimpleName(); // Get jsp program name
Logger log = Logger.getLogger(__jspName);
__jspName = __jspName.replaceAll("_","."); // get back true jsp file name

Однако это не обязательно правильно в отношении того, какой сервер AP и версия вы используете.

Я лично использую метод 1, поскольку я считаю его наиболее надежным.