2009-10-20 18 views

Antwort

7

Was mit falsch:

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

können Sie prepend es mit einem besseren nicht-mehrdeutig Präfix, natürlich. Eigentlich ist etwas in den Zeilen JSPS.source.jsp besser, da Sie Protokollierungsregeln für JSPS Logger einrichten können, die später auf alle Sub-Logger angewendet werden würde.

Nachdem dies gesagt wurde, warum müssen Sie von JSP direkt anmelden?

+0

Was ist falsch an der direkten Protokollierung von JSP? Was wäre die beste Praxis? –

+0

In Tomcat wird obige Anweisung nur mit 'jsp' in der Protokolldatei anstelle von 'source.jsp' ausgegeben. Sie müssen mindestens 'source_jsp' oder this.getClass() verwenden. –

4

Folgendes ist der Code. Die Platzierung und Konfiguration der Konfigurationsdateien entspricht der Verwendung in Servlet oder einer anderen Klasse.

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

Sie eine Factory-Methode schreiben könnte, die die aktuelle Anforderung als Parameter übernimmt, und die erhält einen Logger auf den Namen JSP basiert, etwa so:

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

Sie könnten mit spielen es ein bisschen, damit es funktioniert (Ich habe den obigen Code nicht getestet), aber das ist der Kern davon.

Dies kann direkt von der JSP oder von einer Bean oder einer Tag-Klasse verwendet werden, die von der JSP verwendet wird, solange sie Zugriff auf das Anforderungsobjekt hat.

+0

dies ist nicht das, was ich suche, da die Beziehung zwischen der Anfrage URL und der .JSP-Seite ist weniger als eng, besonders wenn Sie Frameworks wie Federmvc, aber nicht nur verwenden. – flybywire

+0

Nein, wenn Sie eine JSP ausführen, dann wird die requestUri-Eigenschaft der Anfrage * durch die URL der JSP, * nicht * die ursprüngliche URL, die am Container angekommen ist. Denken Sie daran, dass die Anfrage vom Servlet an die JSP weitergeleitet wird, was zu einer neuen Anfrage führt. Es funktioniert, vertrau mir, ich benutze diese Technik selbst. – skaffman

1

Verwenden Sie das entsprechende ConversionPattern bei der Konfiguration von log4j, z:

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

Hier ist die% C den vollständig qualifizierten Klassennamen ausgibt, wenn Sie eine der Logger-Klasse Methoden aufrufen.

14

Erstens importieren das erforderliche Paket d.h.

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

Dann

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

die jsppagename_jsp ändern kann, entsprechend dem Server, den Sie verwenden. Und dann, verwenden Sie überall innerhalb JSP wie:

Die IDE möglicherweise eine Fehlermeldung bei der Deklaration von Logger-Objekt angezeigt. Aber keine Sorge, der Server wie tomcat wird automatisch die entsprechende Servlet-Klasse jeder jsp-Seite innerhalb von tomcat selbst erstellen.

+1

sollte es wie sein: <% @ page import = "org.apache.log4j.Logger"%> –

+0

Das funktioniert wirklich gut. Ich möchte darauf hinweisen, dass der '_jsp' Teil des Klassennamens wesentlich zum Finden der Klasse ist. Ich liebe es, wenn JSPs ihren Klassennamen protokollieren! – Noumenon

0

Da es wahrscheinlich ist, dass Sie ausgeben möchten die Inhalte von jsp-el-Variablen in Log4Net Sie diesen Code

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

Obwohl eine alte Frage verwenden können, würde Ich mag einige Optionen zur Verfügung zu stellen. Sagen Sie jsp Dateiname = for_example.jsp:

1.Verwenden Sie direkt Dateinamen, sondern ersetzen Punkt mit Strich

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

(Anmerkung: ständig Fehler ist ‚for_example.jsp‘ direkt zu verwenden, wird es als Klassenname behandelt und dann, wenn AP-Server, sagen Tomcat, findet keine solche Klassenpfad, wird es ausgegeben Protokollmeldung in catalina.out als "... (jsp) ....".

2. Verwenden Anforderungs-URI

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

Jemand gefällt das. ich Ich weiß nicht warum, aber ich habe das gesehen vorher in jemandes Codes.

3. Verwenden Sie Klassenname

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

dies wird in der Regel bekommen ‚for_example_jsp“ außer wenn for_example.jsp in einem anderen Servlet enthalten ist, sagen ‚test_servlet‘, wird es ‚einschließlich Datei Protokollnamen '+ 'eine geordnete Zahl', zB test_servlet_include_005.

4. Programatically jsp erhalten Dateinamen

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

Dies stimmt jedoch nicht unbedingt mit dem AP-Server und der Version, die Sie verwenden.

Ich persönlich benutze Methode 1, wie ich denke, es ist am zuverlässigsten.

Verwandte Themen