Frage

Ich plane, die Anmeldung in eine Webanwendung zu implementieren, an der ich gerade arbeite, aber ich kämpfe mit einigen Details. Was ist der beste Weg, um eine Java -Webanwendung zu protokollieren?

Speziell;

  • Wohin geht die Konfigurationsdatei in .war -Paketdatei?
  • Wohin melden sich Personen an, relative oder absolute Pfad -Flat -Datei oder eine Datenbank?
  • Geht die Protokollierung von Log4J direkt in die Anwendungsserverprotokolldatei automatisch oder muss Sie etwas einrichten? In diesem Fall verwende ich Tomcat, aber ich benutze oft Jrun.
  • Irgendwelche anderen Gotchas sollte ich mir für die Protokollierung von Webanwendungen bewusst sein?

Derzeit verwende ich Log4J, aber ich stelle mir vor, dass die Best Practices für alle Protokollierungsimplementierungen allgemein angewendet werden.

BEARBEITEN:
Eine Ergänzung zu den Fragen oben.

  • Wo initilisieren Sie die Protokollkonfiguration?

In einer traditionellen App mache ich das am Einstiegspunkt;

DOMConfigurator.configureAndWatch("log4j.xml");

Was wäre die Webanwendung entspricht?

War es hilfreich?

Lösung

Ich platziere meine Konfiguration auf das Standardpaket: src/

und protokollieren Sie bei Dateien mit der Systemeigenschaft $ {Catalina.home}:

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

Andere Tipps

Ich würde Ihnen empfehlen, Sie zu verwenden Slf4j. Dies ist eine einfache Protokollierungsfassade, die die meisten beliebten Protokollierungssysteme unterstützt (Log4j, Commons-Logging, Java -Protokollierungs -API und Wieder anmelden). Es benutzen, Sie können Ihr unterstreicher Protokollierungssystem ersetzen zu jedem anderen, durch einfaches ClassPath -Update.

Der andere Vorteil von Slf4j sind Parametrisierte Anrufe, was den hässlichen Protokollierungscode reduziert.

Eigentlich empfehlen sie zu verwenden Slf4j mit Wieder anmelden. Wieder anmelden ist ein Nachfolger von Log4j. Und es wurde vom selben Autor entworfen.

Wohin geht die Konfigurationsdatei in .war -Paketdatei?Wurzel des Klassenpfads.

Wohin melden sich Personen an, relative oder absolute Pfad -Flat -Datei oder eine Datenbank?Hängt von der Notwendigkeit ab. Es ist immer besser, relative Pfade zu verwenden. Datenbanken sind gut, wenn Sie eine andere Anwendung implementieren, die Protokolle daraus abrufen und sie mit E -Mail/SMS senden

Geht die Protokollierung von Log4J direkt in die Anwendungsserverprotokolldatei automatisch oder muss Sie etwas einrichten? In diesem Fall verwende ich Tomcat, aber ich benutze oft Jrun.Wenn Sie Konsolen Appender verwenden, wird dies in Ihrer Servlet -Container -Protokolldatei angemeldet.

Irgendwelche anderen Gotchas sollte ich mir für die Protokollierung von Webanwendungen bewusst sein?Wenn Sie sich von verschiedenen Threads anmelden Wieder anmelden, Es ist ein Thread-Safe und enthält parametrisierte Protokollnachrichten.

Die Anmeldung an einem DB fügt einen weiteren Fehlerpunkt hinzu. Wir hatten eine Situation, in der sich die Prod -Server an einem DB angemeldet hatten und jemand eine teure Anfrage an dieser DB führte, die sie so sehr verlangsamte, dass die Prod -Server sehr, sehr langsam wurden. Die Anmeldung bei einer Datei kann Probleme verursachen, wenn Ihnen der Platz ausgeht, aber es scheint weniger wahrscheinlich, dass die gesamte App verlangsamt.

Es könnte eine gute Idee sein, die Konfigurationsdatei an einem Ort zu platzieren, an dem ein Administrator sie ändern kann, ohne Ihre Web -App wieder aufzubauen (z. B., damit er eine detaillierte Protokollierung einschalten kann, ohne Sie mitten in der Nacht aufzuwecken).

Leider gibt es keine "offizielle" Möglichkeit, externalisierte Ressourcen aus einer Web -App zu lokalisieren (korrigieren Sie mich, wenn ich falsch liege). Die häufigste Möglichkeit, es zu tun, ist, die Verzeichnisse im Klassenpfad zu durchsehen.

Ich empfehle, die Protokoll -API (log4j) über SLF4J aufzurufen. Auch wenn Sie log4j verwenden, können Webcontainer oder abhängige Module unterschiedliche Protokoll -API verwenden, z. B. Java.util.logging oder Jakarta Commons -Protokollierung. SLF4J stellt Brückenmodule bereit, die sie zu SLF4J -API umleiten. Infolgedessen werden in diesem Fall alle Protokollnachrichten von Log4J geschrieben.

Das ausgezeichnete Papier So machen Sie die Anwendungsprotokollierung richtig Hat ein paar Gotchas.

Ich glaube, dass Ihre anderen Fragen von anderen Personen auf dieser Seite beantwortet wurden.

Ich empfehle auch, SLF4J zu verwenden.

Eine letzte Sache: haben Sprechbare Darstellungen von Objekten kann etwas Zeit sparen.

  • Stellen Sie den Log4J in den Container (Server) ein und erstellen Sie die richtigen Appender pro Anwendung
  • relativ zum Serverpfad, aber das hängt von Ihren Anforderungen ab
  • Wir verwenden Appender, die sich bei verschiedenen Dateien anmelden, von Ihren Anforderungen abhängt, z. B. eine Datei für Hibernate -Info/Statistiken, nur für Anwendung usw.
  • Melden Sie sich nicht viel an, es verlangsamt die Anwendung ab

Persönlich habe ich das log4j.properties in das web-inf-Verzeichnis eingerichtet und verwende einen Init-Servlet mit dem folgenden Code:

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");
}

}

  • Wohin geht die Konfigurationsdatei in .war -Paketdatei?

Am Stamm des Klassenpfades, aber ... fügen Sie die Konfigurationsdatei nicht in das Kriegspaket ein. Sie möchten die Anwendung nicht neu verpacken und neu anwenden, wenn Sie die Protokollierungskonfiguration ändern, oder? Eine bessere Praxis wäre, die Konfigurationsdatei irgendwo im Klassenpfad außerhalb des Krieges zu setzen.

  • Wohin melden sich Personen an, relative oder absolute Pfad -Flat -Datei oder eine Datenbank?

Normalerweise melde ich mich auf dem Dateisystem auf a getrennte Partition (Protokolldateien können sehr schnell wachsen und sollten die Anwendung oder das Betriebssystem niemals blockieren, wenn sie zu groß werden.) Ich benutze die meiste Zeit ein absoluter Pfad Basierend auf dem folgenden Modell:/var/Projekte/basierendu003CPROJECT_NAME> /u003CPRODUCT> /u003CCLUSTER_NAME> /Protokolle/u003CINSTANCE_NAME> .log wou003CPROJECT_NAME> ist der Projektname,u003CPRODUCT> Kann Apache, Tomcat, Weblogic, ..., seinu003CCLUSTER_NAME> der Name des Clusters undu003CINSTANCE_NAME> der Name der Instanz im Cluster. Die Anmeldung am Dateisystem ist schneller als in einer Datenbank. Der Nachteil ist, dass Protokolle nicht zentralisiert sind, wenn Sie mehrere Instanzen und physische Maschinen verwenden. Das Zusammenführen kann jedoch leicht mit einem Skript erfolgen.

  • Geht die Protokollierung von Log4J direkt in die Anwendungsserverprotokolldatei automatisch oder muss Sie etwas einrichten? In diesem Fall verwende ich Tomcat, aber ich benutze oft Jrun.

Anwendungsserverprotokolle sind Anwendungsserverprotokolle, keine Anwendungsprotokolle. Schreiben Sie ihnen nicht, sondern richten Sie ein Logger -Tool (z. B. log4j) ein und schreiben Sie an Anwendungsprotokolle (dediziert verstehen).

  • Irgendwelche anderen Gotchas sollte ich mir für die Protokollierung von Webanwendungen bewusst sein?

Wenn Sie Log4J verwenden, vergessen Sie nicht, den isdebugenabled () vor dem Protokoll zu verwenden:

if(logger.isDebugEnabled()) {
  logger.debug("Bla Bla Bla");
}
  • Wohin geht die Konfigurationsdatei in .war -Paketdatei?

Normalerweise stelle ich keine Protokollierungskonfiguration in die Anwendung, und überlasse dies den AppServer-Administratoren, um Protokollierungsserver zu konfigurieren. In den seltenen Fällen möchte ich, dass die LOG4J-Konfiguration mit einem WebApp bereitgestellt wird. Web-Inf ist der übliche Pfad.

  • Wohin melden sich Personen an, relative oder absolute Pfad -Flat -Datei oder eine Datenbank?

Hängt wiederum von AppServer -Einstellungen ab. Eine gemeinsame Protokolldatei für einen AppServer und das rotieren täglicher Basis ist das übliche Setup. Wenn es App-spezifische Anforderungen gibt, kann der Administrator eine separate Protokolldatei für eine App konfigurieren (unterschieden durch Paket- / Klassennamen).

  • Geht die Protokollierung von Log4J direkt in die Anwendungsserverprotokolldatei automatisch oder muss Sie etwas einrichten? In diesem Fall verwende ich Tomcat, aber ich benutze oft Jrun.

Siehe oben. Für Tomcat, die für Entwicklungszwecke verwendet werden, würde ich nur nach seiner Protokollierungskonfiguration (LOG4J) suchen und dort App-spezifische Spezifikum hinzufügen.

  • Irgendwelche anderen Gotchas sollte ich mir für die Protokollierung von Webanwendungen bewusst sein? Leistung. Beschränken Sie das Log -Level auf ein Minimum (dh Warn oder Fehler), sobald Sie live gehen. Verwendenif (log.isDebugEnabled()) { log.debug("..."); } und konstruiert gleichermaßen in Ihrem Code.

Beachten Sie, dass der Servlet -Standard, wenn Sie nur ein bisschen Protokollierung benötigen, angeben, dass Sie den ServletContext erhalten und dort die Protokollmethoden verwenden können. Das ist das generische Servlet -Äquivalent von System.out.println.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top