2009-10-20 9 views

risposta

7

Cosa c'è di sbagliato con:

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

È possibile anteporre con una migliore prefisso non ambiguo, naturalmente. In realtà, qualcosa del tipo JSPS.source.jsp è migliore, in quanto è possibile impostare le regole di registrazione per il logger JSPS, che in seguito verrà applicato a tutti i sottocamer.

Detto questo, perché è necessario accedere direttamente da JSP?

+0

Cosa c'è di sbagliato nella registrazione da JSP direttamente? Quale sarebbe la migliore pratica? –

+0

In Tomcat, l'istruzione precedente verrà visualizzata con solo 'jsp' nel file di registro, invece di 'source.jsp'. Devi almeno usare 'source_jsp' o this.getClass(). –

4

Quanto segue è il codice. Tutto il posizionamento e la configurazione del file di configurazione sono gli stessi di come viene utilizzato in Servlet o altra classe.

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

Si potrebbe scrivere un metodo factory che prende la richiesta corrente come parametro, e che ottiene un Logger in base al nome JSP, qualcosa di simile:

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

Potrebbe capitare di dover giocare con un po 'per farlo funzionare (non ho testato il codice sopra), ma questo è il succo di esso.

Questo può essere utilizzato direttamente dal JSP o da una classe bean o tag che viene utilizzata da JSP, purché abbia accesso all'oggetto richiesta.

+0

questo non è quello che sto cercando, in quanto la relazione tra l'URL della richiesta e la pagina .jsp è meno stretta, specialmente se si usano framework come mvc di primavera, ma non solo. – flybywire

+0

No, se si sta eseguendo un JSP, la proprietà requestUri della richiesta * sarà * dall'URL del JSP, * non * l'URL originale arrivato al contenitore. Ricorda, la richiesta viene inoltrata dal servlet al JSP, che genera una nuova richiesta. Funziona, credimi, io uso questa tecnica da solo. – skaffman

1

Utilizzare l'appropriato ConversionPattern durante la configurazione di log4j, per esempio:

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

Qui, il% C in uscita il nome completo della classe quando si chiama uno qualsiasi dei metodi di classe Logger.

14

In primo luogo, importare il pacchetto desiderato cioè

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

poi,

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

il jsppagename_jsp potrebbe cambiare, in base al server che si sta utilizzando. E poi, utilizzare in qualsiasi punto all'interno jsp come:

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

L'IDE può mostrare un messaggio di errore alla dichiarazione di oggetto logger. Ma non preoccuparti, il server come tomcat creerà automaticamente la corrispondente classe servlet di ogni pagina jsp all'interno di tomcat direttamente.

+1

dovrebbe essere come: <% @ page import = "org.apache.log4j.Logger"%> –

+0

Funziona molto bene. Voglio sottolineare che la parte '_jsp' del nome della classe è essenziale per trovare la classe. Mi piace che i JSP registrino il loro nome di classe! – Noumenon

0

Poiché è probabile che si desidera in uscita il contenuto del jsp-el-variabili in log4net è possibile utilizzare questo codice

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

Anche se una vecchia questione, vorrei fornire alcune opzioni. Dì jsp filename = for_example.jsp:

1.Utilizzare il nome del file direttamente, ma sostituire il punto con sottolineatura

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

(nota: costantemente errore è quello di usare 'for_example.jsp' direttamente, si sarà trattato come nome della classe e poi quando il server AP, Tomcat dire, non trova tale percorso di classe, lo farà messaggio di registro di uscita in catalina.out come "... (jsp) ....".

2. Usare richiesta URI

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

Qualcuno piace questo. I non so perché, ma ho visto questo prima nei codici di qualcuno. Nome

3. Utilizzare Classe

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

questo di solito ottenere 'for_example_jsp" tranne quando for_example.jsp è incluso in qualche altro servlet, dire 'test_servlet', sara 'compreso il nome del file di log di '+ 'un numero ordinata', ad esempio test_servlet_include_005.

4. Programatically ottenere il nome del file JSP

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

Tuttavia, questo non è necessariamente corretto rispetto a quale server AP e versione si sta utilizzando.

Personalmente utilizzo il metodo 1 come penso sia più affidabile.

Problemi correlati