Log4j2 implementazione

di il
33 risposte

33 Risposte - Pagina 2

  • Re: Log4j2 implementazione

    fulviot66 ha scritto:


    Un'altra questione riguarda l'implementazione di log4j2 nelle pagine .jsp, ma anche qui é il buio totale.
    Dalla documentazione ufficiale mi sembra di aver capito che sia sufficiente specificare nel tag xmlns: il path http://logging.apache.org/log4j/tld/log, ovvero
    Intanto, innanzitutto, serve l'artifact log4j-taglib. Con Maven:
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-taglib</artifactId>
                <version>2.x.x</version>
            </dependency>
    (2.x.x la versione reale che è .. )

    Poi sulla documentazione ufficiale c'è una nota importante qui: https://logging.apache.org/log4j/2.x/log4j-taglib/index.html
    Alcuni container (es. Tomcat, anzi, alcune versioni di Tomcat) per questioni di performance ignorano certi jar che contengono i TLD. Quindi bisogna verificare se è il caso in cui il TLD dentro il jar log4j-taglib viene preso oppure no.

    A patto che sia tutto ok, in una pagina JSP (JSP normale, non sto parlando delle JSPX) basta poi mettere all'inizio:

    <%@ taglib prefix="log" uri="http://logging.apache.org/log4j/tld/log" %>

    come indicato dalla documentazione https://logging.apache.org/log4j/2.x/log4j-taglib/tlddoc/log/tld-summary.html

    e poi usare

    es. <log:info message=" blablabla " />

    EDIT: si può anche mettere il <log:logger> per impostare il nome del logger
  • Re: Log4j2 implementazione

    Grazie @andbin,
    ora tutto è più chiaro.
    Tuttavia non sono ancora riuscito a capire perché manchi la corrispondenza con il numero di linea delle pagine .jsp
    2020-07-27 14:35:56.547  INFO  [http-bio-8080-exec-3]: /AfiWeb/WebContent/home.jsp:3331 - Sono nella HomePage (head)
    2020-07-27 14:35:57.360  INFO  [http-bio-8080-exec-3]: org.apache.jsp.include.includeMnt_jsp:182 - FileNotFoundException e1
    infatti la HP in questione ha solamente 1013 linee e la pagina includeMnt.jsp solamente 62!
  • Re: Log4j2 implementazione

    fulviot66 ha scritto:


    Tuttavia non sono ancora riuscito a capire perché manchi la corrispondenza con il numero di linea delle pagine .jsp
    Una pagina jsp viene "tradotta" nel sorgente Java di una Servlet che poi viene compilato dal Servlet container. Quindi la chiamata di log si trova fisicamente in un sorgente Java che è radicalmente differente dalla pagina jsp. Anzi, per dire precisamente, in quel sorgente generato ci sono le invocazioni relative al ciclo di vita del custom tag che usi es. <log:info> . La chiamata materiale al logger.xyz() sta nella implementazione del custom tag.

    Non sono ovviamente sicuro al 100% in questo momento (dovrei andare a leggere) ma credo che non si possa avere una informazione precisa sulla riga nella jsp.
  • Re: Log4j2 implementazione

    Grazie alle tue precisazioni,
    sono riuscito a loggare alcuni messaggi.
    Purtroppo però se tento di loggare delle eccezioni, come ad es.
    catch(FileNotFoundException e){
    		%>
    		<c:catch var = "myException"><%=e%></c:catch>
    		<log:catching exception="${myException}" />	
    		<%
    mi compare il seguente errore:
    Unable to convert string "${myException}" to class "java.lang.Throwable" for attribute "exception": Property Editor not registered with the PropertyEditorManager

    come dovrei fare?
  • Re: Log4j2 implementazione

    fulviot66 ha scritto:


    catch(FileNotFoundException e){
    		%>
    		<c:catch var = "myException"><%=e%></c:catch>
    		<log:catching exception="${myException}" />	
    		<%
    Innanzitutto stai facendo un bel (="brutto") miscuglio di scriplet Java e custom tag. Il c:catch si usa diversamente. C'è l'esempio sulla documentazione del Tag catching: https://logging.apache.org/log4j/2.x/log4j-taglib/tlddoc/log/catching.html

    In pratica il <c:catch> di JSTL deve racchiudere tutta la parte "critica" che può lanciare eccezione. Non ha senso che racchiuda un <%=e%>
  • Re: Log4j2 implementazione

    Cioè,
    mi stai dicendo che devo sostituire il costrutto try/catch nella jsp con <c:catch> ?
    Sto provando a ricreare nel mio codice la struttura dell'esempio:
    <c:catch var="myException">
        <%= 5 / 0 %>
    </c:catch>
    <c:if test="${myException != null}">
        <log:catching exception="${myException}" />
    </c:if>
    ma non funziona.
  • Re: Log4j2 implementazione

    fulviot66 ha scritto:


    mi stai dicendo che devo sostituire il costrutto try/catch nella jsp con <c:catch> ?
    Sì .... serve proprio per quello!!

    fulviot66 ha scritto:


    Sto provando a ricreare nel mio codice la struttura dell'esempio:
    ma non funziona.
    La parte <%= 5 / 0 %> è ovviamente solo di "esempio" per mostrare qualcosa che certamente fallisce (divisione per 0 ---> ArithmeticException). Ovviamente ci metti tutta la tua parte (potenzialmente anche tutto il contenuto della pagina) dove c'è qualcosa che potrebbe lanciare eccezione.

    E comunque: con "non funziona" cosa intendi?

    P.S. chiarisci solo un attimo due cose: a) quale versione di JSTL stai usando, 1.0, 1.1 o 1.2 ; b) su quale versione delle specifiche Servlet è basato il tuo progetto, lo vedi nel web.xml all'inizio (c'è un version) o dalle impostazioni del progetto.
  • Re: Log4j2 implementazione

    Ciao @andbin,
    questo è il mio codice, il messaggio che vorrei ottenere nell'eccezione è quello indicato nell'ultima riga.
    Sto lavorando su un progetto JavaEE senza maven e nel mio file web.xml non c'è nessuna version
    
    		//try{
    		%>
    		<c:catch var="myException1">
    		<%
    			u = new URL(path);
    			in = new BufferedReader(
    					new InputStreamReader(
    						u.openStream()));
    		//}catch(FileNotFoundException e1){
    		%>
    		</c:catch>
    		<c:if test="${myException1 != null}">
        	<log:catching exception="${myException1}" />
    		</c:if>
    		<log:error logger="/include/includeMnt.jsp" message="Impossibile trovare il percorso: /AfiWebExternal/Images/logo.txt" />	
    		<%
    		//}
    
    Il risultato è che si spacca e la prima riga dell'errore riporta:
    Unable to convert string "${myException1}" to class "java.lang.Throwable" for attribute "exception": Property Editor not registered with the PropertyEditorManager

    Forse la versione 2.4 di Log4j2 che sto usando non supporta questa feature?
  • Re: Log4j2 implementazione

    fulviot66 ha scritto:


    Sto lavorando su un progetto JavaEE senza maven e nel mio file web.xml non c'è nessuna version
    C'è sicuramente, anche solo nella dichiarazione del DTD.

    fulviot66 ha scritto:


    Il risultato è che si spacca e la prima riga dell'errore riporta:
    Unable to convert string "${myException1}" to class "java.lang.Throwable" for attribute "exception": Property Editor not registered with the PropertyEditorManager
    A "naso" direi che sono questioni relative alle versioni di Servlet spec, JSTL ecc....

    Quindi ti richiedo:
    a) quale versione di JSTL stai usando. Lo puoi forse vedere dal nome del jar di JSTL oppure comunque lo puoi estrapolare dal Manifest all'interno del jar.
    b) quale versione delle Servlet spec. dichiara il web.xml. C'è sicuramente una versione, se non c'è un version="x.y" è sicuramente nel modo "vecchio" con il DTD.
    c) quale Servlet container (es. Tomcat) stai usando e quale versione esatta.

    fulviot66 ha scritto:


    Forse la versione 2.4 di Log4j2 che sto usando non supporta questa feature?
    No, non c'entra la versione di log4j 2.x
  • Re: Log4j2 implementazione

    Credo che la rottura del codice fosse causata dalla mancanza di un paio di librerie della JSTL, nella fattispecie:
    • - taglibs-standard-spec-1.2.5.jar
      - taglibs-standard-impl-1.2.5.jar
    La versione di Tomcat è la 7.064.
    Dal file web.xml desumo: <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dt">

    Ora, l'applicazione non si spacca più, ma non compare nessuna riga che logga l'eccezione, che dovrebbe essere compresa tra le due seguenti, dato che il precedente snippet si trova in una page include nella head della HomePage.

    2020-07-28 10:04:16.289 INFO [http-bio-8080-exec-3]: /AfiWeb/WebContent/home.jsp:3337 - Sono nella HomePage (head)
    2020-07-28 10:04:17.677 INFO [http-bio-8080-exec-3]: org.apache.jsp.home_jsp:6865 - Sono nella HomePage (body)
  • Re: Log4j2 implementazione

    fulviot66 ha scritto:


    Credo che la rottura del codice fosse causata dalla mancanza di un paio di librerie della JSTL, nella fattispecie:
    • - taglibs-standard-spec-1.2.5.jar
      - taglibs-standard-impl-1.2.5.jar
    In realtà quale/i jar per JSTL dipende da dove li prendi. Quella mi pare la versione fornita da Apache Tomcat. Ma non è l'unica possibile.

    EDIT: JSTL, anche se è definito "standard" tag lib, in realtà non è necessariamente già presente nei server. E' presente già di serie sugli application server come GlassFish ma sui semplici Servlet container come Tomcat/Jetty no! JSTL in questi casi va integrato a mano nella webapp.

    fulviot66 ha scritto:


    Dal file web.xml desumo: <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-ap_2_3.dtd">
    Ecco, questo è un altro problema. La documentazione dei custom tag di log4j2 (https://logging.apache.org/log4j/2.x/log4j-taglib/index.html) dice chiaramente:

    The Log4j Tag Library requires at least Servlet 2.5 (or Java EE 5), at least JSP 2.1 (or Java EE 5)

    E JSTL 1.2 richiede anch'essa Servlet 2.5/JSP 2.1. Quindi devi aggiornare il web.xml. Cerca in rete la dichiarazione iniziale per la versione 2.5 (se non la trovi, te la trovo io). Altrimenti continuerà a non funzionarti.

    Tomcat 7.x va bene, supporta le Servlet 3.0/JSP 2.2 quindi anche di più ma comunque ok.
  • Re: Log4j2 implementazione

    In rete ho trovato la seguente:
    <web-app xmlns="http://java.sun.com/xml/ns/j2e" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instanc" xsi:schemaLocation="http://java.sun.com/xml/ns/javae http://java.sun.com/xml/ns/javaee/web-app_2_5.xs" version="2.5" >
    Tuttavia Eclipse mi segnala l'errore nel file web.xml:
    The processing instruction target matching "[xX][mM][lL]" is not allowed.
    Quando lancio Tomcat, ottengo:
    Non è consentita una destinazione di istruzione di elaborazione corrispondente a "[xX][mM][lL]".
  • Re: Log4j2 implementazione

    fulviot66 ha scritto:


    <web-app xmlns="http://java.sun.com/xml/ns/j2e" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instanc" xsi:schemaLocation="http://java.sun.com/xml/ns/javae http://java.sun.com/xml/ns/javaee/web-app_2_5.xs" version="2.5" >
    La si trova citata su molti siti ma quella citata dalla documentazione Oracle è un pochino diversa:

    https://docs.oracle.com/html/E13712_04/web_xml.ht
  • Re: Log4j2 implementazione

    Credo di averla copiata correttamente:
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    id="WebApp_ID" version="2.5">
    	<display-name>AfiWeb</display-name>
    
    l'errore ora è cambiato, Eclipse mi segna rossi tutti i <display-name> all'interno delle dichiarazioni delle servlet, indicando l'errore:
    cvc-complex-type.2.4.a: Invalid content was found starting with element 'display-name'. One of '{"http://
    java.sun.com/xml/ns/javaee":servlet-class, "}' is expected.
  • Re: Log4j2 implementazione

    fulviot66 ha scritto:


    <?xml version="1.0" encoding="UTF-8"?>
    
    ma l'errore persiste, anche se rimuovo la sezione <display-name> e </web-app>
    La chiusura </web-app> è obbligatoria, non la puoi togliere.

    Riguardo l'errore invece verifica bene l'inizio del file. La parte <?xml deve essere la PRIMISSIMA cosa del file. Verifica se all'inizio del file esiste fisicamente il BOM, Byte Order Mark, una sequenza di pochi byte per indicare l'ordine dei byte. Che però è invisibile nell'editor di Eclipse. E causa problemi perché le API Java che leggono il web.xml NON trattano il BOM.

    Riscrivi magari il file da zero in maniera "pulita".
Devi accedere o registrarti per scrivere nel forum
33 risposte