Domanda

Sto pianificando di implementare il log in un'applicazione web su cui sto attualmente lavorando ma sto lottando con alcuni dettagli. Qual è il modo migliore per accedere alla registrazione di un'applicazione Web Java?

In particolare;

  • Dove si trova il file di configurazione nel file del pacchetto .war?
  • Dove accedono le persone, file flat percorso relativo o assoluto o un database?
  • La registrazione di Log4J va automaticamente nel file di registro del server delle applicazioni automaticamente o è qualcosa che devi configurare? In questo caso sto usando Tomcat, ma uso spesso Jrun.
  • Qualche altro problema che dovrei conoscere per la registrazione delle applicazioni web?

Attualmente sto usando Log4J ma immagino che le migliori pratiche si applichino universalmente a tutte le implementazioni di registrazione.

EDIT:
Un'aggiunta alle domande in alto.

  • Dove si avvia il registro configurazione?

In un'app tradizionale, lo faccio al punto di ingresso;

DOMConfigurator.configureAndWatch("log4j.xml");

Quale sarebbe l'equivalente dell'applicazione Web?

È stato utile?

Soluzione

Posiziono la mia configurazione sul pacchetto predefinito: src /

e accedi ai file usando la proprietà di sistema $ {catalina.home}:

log4j.appender.???.file=${catalina.home}/logs/system.log

Altri suggerimenti

Ti consiglio di usare SLF4J . Questa è una facciata di registrazione semplice che supporta la maggior parte dei sistemi di registrazione più diffusi ( Log4j , registrazione comune , API di registrazione Java e Logback ). Usandolo, sarai in grado di sostituire il tuo sistema di registrazione di sottolineatura con qualsiasi altro, con un semplice aggiornamento di CLASSPATH.

L'altro vantaggio di SLF4J sono chiamate con parametri , che riduce il brutto codice di registrazione.

In realtà, raccomandano di usare SLF4J con Logback . Logback è il successore di Log4J . Ed è stato progettato dallo stesso autore.

Dove si trova il file di configurazione nel file del pacchetto .war? Radice del percorso di classe.

Dove accedono le persone, file flat percorso relativo o assoluto o un database? Dipende dalla necessità. È sempre meglio usare percorsi relativi. I database sono utili se si implementa un'altra applicazione che recupererà i log da essa e li invierà tramite e-mail / sms

La registrazione di Log4J va automaticamente nel file di registro del server delle applicazioni o è qualcosa che devi configurare? In questo caso sto usando Tomcat, ma uso spesso Jrun. Se si utilizza l'appender della console, sì, verrà registrato nel file di registro del contenitore servlet.

Qualche altro problema che dovrei conoscere per la registrazione delle applicazioni web? Se accedi da thread diversi, utilizza logback , è thread-safe ed espone messaggi di log con parametri.

La registrazione su un DB aggiunge un altro punto di errore. Abbiamo avuto una situazione in cui i server prod hanno registrato su un DB e qualcuno ha eseguito una query costosa su quel DB che lo ha rallentato così tanto che i server prod hanno ottenuto molto, molto lentamente. La registrazione in un file può causare problemi se si esaurisce lo spazio, ma sembra meno probabile che rallenti l'intera app.

Potrebbe essere una buona idea posizionare il file di configurazione in un punto in cui un amministratore può modificarlo senza ricostruire l'app Web (ad esempio, in modo che possano attivare la registrazione dettagliata senza svegliarti nel cuore della notte).

Sfortunatamente, non c'è " <<> ufficiale quot; modo per individuare risorse esterne da un'app Web (correggimi se sbaglio). Il modo più comune di farlo che ho visto è guardare attraverso le directory nel percorso di classe.

Consiglio di chiamare l'API di registro (log4j) tramite slf4j. Anche se si utilizza log4j, il contenitore Web o i moduli dipendenti possono utilizzare API di registro diverse come Java.util.logging o la registrazione dei beni comuni di Jakarta. Slf4j fornisce moduli bridge che li reindirizzano all'API slf4j. Di conseguenza, in questo caso tutti i messaggi di registro vengono scritti da log4j.

L'eccellente documento Come eseguire correttamente la registrazione delle applicazioni ha un sacco di trucchi.

Credo che le tue altre domande abbiano ricevuto risposta da altre persone in questa pagina.

Consiglio anche di usare SLF4J.

Un'ultima cosa: avere rappresentazioni parlabili di oggetti può farti risparmiare un po 'di tempo.

  • inserisce log4j nel contenitore (server) e crea appendici appropriate per applicazione
  • relativo al percorso del server, ma ciò dipende dalle tue esigenze
  • utilizziamo appendici che accedono a file diversi, dipende dalle tue esigenze, ad es. un file per informazioni / statistiche di ibernazione, uno solo per l'applicazione, ecc.
  • non registra molto, rallenta l'applicazione

Personalmente inserisco log4j.properties nella directory WEB-INF e utilizzo un servlet init con il seguente codice:

public class InitServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {

private static final String LOG4J_FILE = "WEB-INF/log4j.properties";

public InitServlet() {
    super();
}

@Override
public void init() throws ServletException {
    super.init();
    PropertyConfigurator.configure(getServletContext().getRealPath(LOG4J_FILE));
    LogFactory.getLog(InitServlet.class).info("LOG 4J configured");
}

}

  • Dove si trova il file di configurazione nel file del pacchetto .war?

Alla radice del classpath ma ... Non inserire il file di configurazione nel pacchetto war. Non si desidera riconfezionare e ridistribuire l'applicazione se si modifica la configurazione della registrazione, vero? Una pratica migliore sarebbe quella di mettere il file di configurazione da qualche parte nel percorso di classe fuori dalla guerra.

  • Dove accedono le persone, file flat percorso relativo o assoluto o un database?

Di solito accedo al file system su una partizione separata (i file di registro possono crescere molto velocemente e non dovrebbero mai bloccare l'applicazione o il sistema operativo se diventano troppo grandi). Uso il più delle volte un percorso assoluto basato sul seguente modello: / var / progetti / & Lt; PROJECT_NAME & Gt; / & Lt; PRODUCT & Gt; / < CLUSTER_NAME > / logs / < INSTANCE_NAME > .log dove < PROJECT_NAME > è il nome del progetto, < PRODUCT > può essere Apache, Tomcat, Weblogic, ..., < CLUSTER_NAME > il nome del cluster e < INSTANCE_NAME > il nome dell'istanza all'interno del cluster. La registrazione nel file system è più veloce che in un database. Lo svantaggio è che i registri non sono centralizzati se si utilizzano più istanze e macchine fisiche. Ma l'unione può essere facilmente eseguita con uno script.

  • La registrazione di Log4J va automaticamente nel file di registro del server delle applicazioni automaticamente o è qualcosa che devi configurare? In questo caso sto usando Tomcat, ma uso spesso Jrun.

I registri del server delle applicazioni sono registri del server delle applicazioni, non registri delle applicazioni. Non scrivere a loro, ma impostare uno strumento di registrazione (ad esempio log4j) e scrivere nei registri delle applicazioni (capire dedicato).

  • Qualche altro problema che dovrei conoscere per la registrazione delle applicazioni web?

Se stai usando log4j, non dimenticare di usare isDebugEnabled () prima di accedere:

if(logger.isDebugEnabled()) {
  logger.debug("Bla Bla Bla");
}
  • Dove si trova il file di configurazione nel file del pacchetto .war?

Di solito, non inserisco alcuna configurazione di registrazione nell'applicazione, piuttosto lasciala agli amministratori di appserver per configurare la registrazione a livello di server. Nei rari casi in cui voglio che la configurazione di log4j sia distribuita con una webapp, WEB-INF è il solito percorso.

  • Dove accedono le persone, file flat percorso relativo o assoluto o un database?

Ancora una volta, dipende dalle impostazioni del server applicazioni. Un file di registro comune per un appserver e rotante su base giornaliera è la solita configurazione. Se sono presenti esigenze specifiche dell'app, l'amministratore può configurare un file di registro separato per un'app (distinto per i nomi di pacchetto / classe).

  • La registrazione di Log4J va automaticamente nel file di registro del server delle applicazioni automaticamente o è qualcosa che devi configurare? In questo caso sto usando Tomcat, ma uso spesso Jrun.

Vedi sopra. Per tomcat utilizzato per scopi di sviluppo, cercherò solo la sua configurazione di registrazione (log4j) e aggiungere lì specifiche di app specifiche.

  • Qualche altro problema che dovrei conoscere per la registrazione delle applicazioni web? Prestazione. Limitare il livello di registro al minimo (ad es. WARN o ERRORE) una volta attivato. Uso if (log.isDebugEnabled()) { log.debug("..."); } e costrutti simili nel tuo codice.

Nota che se hai solo bisogno di un po 'di registrazione, lo standard servlet specifica che puoi ottenere ServletContext e usare lì i metodi di registro. Questo è l'equivalente servlet generico di System.out.println.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top