Я имею в виду, я хочу, чтобы имя регистратора отражало файл source.jsp, независимо от того, включен ли он в другой файл или скомпилирован в класс или что-то еще.
Как правильно использовать log4j в jsp-страницах
Ответ 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, поскольку я считаю его наиболее надежным.