2009-10-20 14 views

Respuesta

7

¿Qué hay de malo en:

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

puede anteponer con una mejor prefijo no ambigua, por supuesto. En realidad, es mejor algo a lo largo de las líneas JSPS.source.jsp, ya que puede configurar reglas de registro para el registrador JSPS, que luego se aplicarán a todos los subloggers.

Habiendo dicho esto, ¿por qué necesita iniciar sesión directamente desde JSP?

+0

¿Qué pasa con el registro de JSP directamente? ¿Cuál sería la mejor práctica? –

+0

En Tomcat, la instrucción anterior se imprimirá con solo 'jsp' en el archivo de registro, en lugar de 'source.jsp'. Tienes que usar al menos 'source_jsp' o this.getClass(). –

4

El siguiente es el código. Toda la ubicación y la configuración del archivo de configuración son las mismas que se usan en Servlet u otra clase.

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

Se puede escribir un método de fábrica que tiene la petición actual como un parámetro, y el que obtiene un registrador basado en el nombre de JSP, algo como esto:

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

Puede que tenga que jugar con es un poco para que funcione (no he probado el código anterior), pero esa es la esencia de esto.

Esto podría usarse directamente desde el JSP, o desde una clase de bean o tag que utiliza el JSP, siempre que tenga acceso al objeto de solicitud.

+0

esto no es lo que estoy buscando, ya que la relación entre la URL de solicitud y la página .jsp es menos estricta, especialmente si utiliza frameworks como spring mvc, pero no solo. – flybywire

+0

No, si está ejecutando un JSP, la propiedad requestUri de la solicitud * será * por el URL del JSP, * no * el URL original que llegó al contenedor. Recuerde, la solicitud se reenvía del servlet al JSP, lo que da como resultado una nueva solicitud. Funciona, créeme, yo uso esta técnica yo mismo. – skaffman

1

uso apropiado del ConversionPattern al configurar log4j, por ejemplo:

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

Aquí, el% de C emite el nombre de clase completo cuando se llama a cualquiera de los métodos de la clase Logger.

14

En primer lugar, importar el paquete requerido es decir

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

entonces,

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

la jsppagename_jsp puede cambiar, de acuerdo con el servidor que está utilizando. Y luego, utilizar en cualquier lugar dentro de JSP como:

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

El IDE puede mostrar un mensaje de error en la declaración de objeto registrador. Pero no se preocupe, el servidor como Tomcat creará automáticamente la clase de servlet correspondiente de cada página jsp dentro de tomcat directamente.

+1

debería ser como: <% @ page import = "org.apache.log4j.Logger"%> –

+0

Esto funciona muy bien. Quiero señalar que la parte '_jsp' del nombre de clase es esencial para encontrar la clase. ¡Me encanta que JSPs registren su nombre de clase! – Noumenon

0

Dado que es probable que desea emitir el contenido de las variables-el-JSP en log4net puede utilizar este código

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

Aunque una vieja pregunta, me gustaría ofrecer algunas opciones. Diga jsp filename = for_example.jsp:

1.Utilizar nombre de archivo directamente, sino que en lugar de punto con subrayado

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

(nota: en constante error es utilizar 'for_example.jsp' directamente, será tratado como nombre de la clase y luego, cuando el servidor AP, Tomcat decir, no encuentra tales ruta de clase, lo hará mensaje de registro de salida en catalina.out como "... (JSP) ....".

2. uso petición URI

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

Alguien le gusta esto. yo no sé por qué, pero he visto esto antes en los códigos de alguien. Nombre

3. Uso Clase

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

lo cual suele conseguir 'for_example_jsp" excepto cuando for_example.jsp está incluido en algún otro servlet, dicen 'test_servlet', será 'incluyendo el nombre del archivo de registro '+ 'un número ordenada', por ejemplo test_servlet_include_005.

4. Programatically obtener el nombre de archivo JSP

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

Sin embargo, esto no es necesariamente correcto con respecto a qué servidor AP y versión está utilizando.

Yo personalmente uso el método 1 porque creo que es más confiable.

Cuestiones relacionadas