Regeln und Hinweise zur Protokollierung?

13

In meiner Organisation haben wir einige Regeln / Richtlinien zur Protokollierung zusammengestellt, die ich gerne wissen möchte, ob Sie sie ergänzen oder kommentieren können.

Wir verwenden Java, aber Sie können allgemein Kommentare zu Anmelderegeln und Ratschlägen abgeben

  1. Verwenden Sie die richtige Protokollierungsstufe

    • FEHLER: Etwas ist sehr schief gelaufen und muss sofort behoben werden
    • WARNUNG: Der Vorgang kann ohne Korrektur fortgesetzt werden. Die Anwendung sollte dieses Niveau tolerieren, aber die Warnung sollte immer untersucht werden.
    • INFO: Information, dass ein wichtiger Prozess abgeschlossen ist
    • DEBUGGEN. Wird nur während der Entwicklung verwendet
  2. Stellen Sie sicher, dass Sie wissen, was Sie protokollieren.

  3. Vermeiden Sie, dass die Protokollierung das Verhalten der Anwendung beeinflusst

Die Funktion der Protokollierung sollte darin bestehen, Meldungen in das Protokoll zu schreiben.

  1. Protokollnachrichten sollten beschreibend, klar, kurz und präzise sein.

Bei der Fehlerbehebung wird eine Unsinnmeldung nicht häufig verwendet.

  1. Stellen Sie die richtigen Eigenschaften in log4j

Setzen Sie ein, dass die richtige Methode und Klasse automatisch geschrieben wird.

Beispiel:

Datendatei -web

log4j.rootLogger=ERROR, DATEDFILE
log4j.logger.org.springframework=INFO
log4j.logger.waffle=ERROR
log4j.logger.se.prv=INFO
log4j.logger.se.prv.common.mvc=INFO
log4j.logger.se.prv.omklassning=DEBUG

log4j.appender.DATEDFILE=biz.minaret.log4j.DatedFileAppender
log4j.appender.DATEDFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATEDFILE.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%C{1}.%M] - %m%n

log4j.appender.DATEDFILE.Prefix=omklassning.
log4j.appender.DATEDFILE.Suffix=.log
log4j.appender.DATEDFILE.Directory=//localhost/WebSphereLog/omklassning/
  1. Protokollwert.

Bitte protokollieren Sie die Werte aus der Anwendung.

  1. Protokollpräfix.

Geben Sie an, von welchem ​​Teil der Anwendung aus die Protokollierung geschrieben wird, vorzugsweise mit einem für das Projekt vereinbarten Präfix, z PANDORA_DB

  1. Die Menge an Text.

Achten Sie darauf, dass nicht zu viel Protokolltext angezeigt wird. Dies kann die Leistung der App beeinflussen.

  1. Protokollierungsformat:

-Es gibt verschiedene Varianten und Methoden, die mit log4j verwendet werden können, aber wir möchten eine einheitliche Verwendung des folgenden Formats, wenn wir uns mit Ausnahmen anmelden:

logger.error("PANDORA_DB2: Fel vid hämtning av frist i TP210_RAPPORTFRIST", e);

Im obigen Beispiel wird davon ausgegangen, dass wir die log4j-Eigenschaften so festgelegt haben, dass die Klasse und die Methode automatisch geschrieben werden.

Verwenden Sie immer einen Logger und nicht Folgendes:

System.out.println(), System.err.println(), e.printStackTrace()

Wenn die Web-App unser Framework verwendet, können Sie sehr detaillierte Fehlerinformationen von EJB erhalten, wenn Sie try-catch im Handler verwenden und gemäß dem obigen Modell protokollieren:

In unserem Projekt verwenden wir dieses Konvertierungsmuster, mit dem Methoden- und Klassennamen automatisch ausgeschrieben werden. Hier verwenden wir zwei verschiedene Muster für die Konsole und für den datierten Dateipuffer:

log4j.appender.CONSOLE.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

log4j.appender.DATEDFILE.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

In den obigen Beispielen werden Methode und Klasse ausgeschrieben. In der Konsole wird auch unsere Zeilennummer eingetragen.

  1. toString()

Bitte haben Sie eine toString()für jedes Objekt. EX:

@Override
public String toString() {
  StringBuilder sb = new StringBuilder();
  sb.append(" DwfInformation [ ");
  sb.append("cc: ").append(cc);
  sb.append("pn: ").append(pn);
  sb.append("kc: ").append(kc);
  sb.append("numberOfPages: ").append(numberOfPages);
  sb.append("publicationDate: ").append(publicationDate);
  sb.append("version: ").append(version);
  sb.append(" ]");
  return sb.toString();
}

anstelle einer speziellen Methode, die diese Ausgaben machen

public void printAll()
{
    logger.info("inbet: " + getInbetInput());
    logger.info("betdat: " + betdat);
    logger.info("betid: " + betid);
    logger.info("send: " + send);
    logger.info("appr: " + appr);
    logger.info("rereg: " + rereg);   
    logger.info("NY: " + ny);   
    logger.info("CNT: " + cnt);   
}

Gibt es also irgendetwas, das Sie hinzufügen, kommentieren oder in Frage stellen können, wenn Sie die Protokollierung verwenden? Sie können jederzeit antworten oder kommentieren, auch wenn es sich nicht um Java handelt. Java und log4j sind nur Beispiele dafür, wie dies begründet ist.

Niklas
quelle
1
@gnat - Ich denke du hast recht, es gibt eine Menge Überschneidungen zwischen den beiden Fragen. Ich kämpfe jedoch darum, es als Duplikat zu bezeichnen.

Antworten:

4

Als Erweiterung Ihrer Protokollierungsregel, woher die Protokollanweisung in der Anwendung stammt, können Sie Protokollierungsflags auf Modulebene hinzufügen. Anstatt immer alles zu protokollieren, können Sie stattdessen gezielt Teile Ihrer Anwendung auswählen. Dies ist mit einem Mehraufwand verbunden, und Sie müssen eine Funktion erstellen, mit der Sie diese Protokollierung aktivieren / deaktivieren können. Im Idealfall können Sie die Funktion während der Ausführung der Anwendung aktivieren / deaktivieren.

Ich bin es gewohnt, einen Layer unter debug zu sehen, den ich als "Trace" bezeichne, aber das ist nicht unbedingt ein universeller Begriff. Protokollierung auf "Trace" -Ebene verfolgt so viel wie möglich, einschließlich Modulein- / ausgang, Zeitstempel mit Ein- / Ausstieg und Bonuspunkte für die Erfassung der übergebenen Werte. Offensichtlich erzeugt das eine Menge Daten und es ist nicht etwas, das man willkürlich einschaltet. Es hat jedoch Vorteile in Bezug auf das Debuggen, wenn Sie keine Verbindung zum Prozess herstellen können oder keinen Core-Dump der fehlerhaften Anwendung haben.

Ich möchte Datei- / Modulreferenzen und Zeitstempel mit meinen Protokollinformationen sehen. Dies kann nützlich sein, wenn Sie versuchen, Wettlaufbedingungen zwischen Threads aufzuspüren und die Aktivitäten mehrerer Bereiche der Anwendung zu koordinieren. Um fair zu sein, ich kenne einige Leute, die glauben, dass diese Details die Protokolldatei durcheinander bringen. Das Hinzufügen des Zeitstempels ist mit dem Team zu besprechen. (Entschuldigung, wenn log4j das bereits tut.)

Wenn die Protokollierung nicht von einem eigenen Thread / Prozess übernommen wird, sollten Sie dies ebenfalls berücksichtigen. Anstatt den Anwendungsthread auf die Verarbeitung der Protokollierung warten zu lassen, wird die Protokollnachricht an den Protokollhandler weitergeleitet, und der Anwendungsthread geht seinen fröhlichen Weg. Alternativ können Sie eine Art Puffermechanismus für die Verarbeitung der Protokollnachrichten erstellen, um die Reaktionsfähigkeit der Anwendung zu beschleunigen.

Eine weitere zu berücksichtigende Funktion ist die Steuerung der Größe und des Verlaufs von Protokolldateien. Sie möchten nicht, dass die App den gesamten Speicherplatz auf dem Host-System ausbläst, und Sie möchten nicht unbedingt alle Protokolldateien für alle Ewigkeit aufbewahren.


quelle
2

Beachten Sie, dass Sie die Protokollierungsstufe überprüfen müssen, bevor Sie Zeichenfolgenoperationen für die Protokollierung ausführen. Nehmen Sie sich also nicht die ganze Arbeit vor, ein Datumsformatierungsprogramm einzurichten oder eine Reihe von Zeichenfolgen zu verketten, um die Protokollnachricht zu erstellen, wenn Sie sie nicht tatsächlich protokollieren möchten. Das ist nur verschwendete Arbeit, die Ihre Anwendung verlangsamt.

Zu Ihrer Information, das Apache Commons-Projekt verfügt über eine ToStringBuilder Klasse , die das Erstellen Ihrer toString()Methoden vereinfacht .

TMN
quelle
1

Ich finde nichts fragwürdiges an dem, was du hier hinzugefügt hast, Nick. So mache ich das seit einiger Zeit. Der Beitrag, den Sie bereitgestellt haben, ist sehr detailliert und kann wahrscheinlich als eine Art Tutorial für die Protokollierung verwendet werden. Ich möchte hier jedoch eines hinzufügen, nämlich: An vielen Stellen habe ich Kerle gesehen, die bedingte Protokollierung verwenden, zum Beispiel:

     if(env_local)
     {
     write_to_local();
     }    
     else if(env_IT)
     {
     write_to_IT();
     } 
     else if(env_PROD)
     {
     write_to_prod();
     } 
     else
     dosomething();

Ich denke, diese Art des bedingten Tracings oder Debuggens ist nicht der beste Weg.

Der dunkle Ritter
quelle
1

Zusätzlich zur Protokollierung der Klasse / Methode, die den Fehler ausgelöst hat, ist es hilfreich, auch die an diese Methode übergebenen Parameter zu protokollieren. Zu wissen, wo ein Fehler aufgetreten ist, ist nicht sehr nützlich, wenn es nur 1 Mal von 1000 vorkommt. Sie müssen auch wissen, welche Daten den Fehler verursacht haben.

Ich fand es auch nützlich, eine Variable zu haben, die die Standardstufe der Protokollierung für eine Anwendung definiert. Auf diese Weise können Sie DEBUG- und INFO-Code neben WARNING- und ERROR-Code haben. Wenn Sie im Produktionsmodus arbeiten, geben Sie standardmäßig keine DEBUG-Informationen aus. Wenn jedoch ein Fehler auftritt, können Sie ein Flag aktualisieren und DEBUG-Nachrichten in das Protokoll schreiben.

Briddums
quelle
1

Protokollierung ist die meiste Zeit ein Querschnittsthema. Java allein reicht nicht aus, um die Protokollierung von Ihrer eigentlichen Geschäftslogik zu trennen. Dies bedeutet, dass Sie beispielsweise nicht nur eine Methode verwenden und in ein anderes Projekt einfügen können, sondern dass Sie alle Protokollierungen entfernen und anpassen müssen, bevor Sie dies tun. Und das ist nur die Spitze des Eisbergs.

Um dies und andere Probleme bei der Vermischung von Protokollierung und "echter" Geschäftslogik zu vermeiden, sollten Sie die Verwendung aspektorientierter Programmierung in Betracht ziehen. Für Java wäre das am häufigsten verwendete Framework AspectJ. Es gibt dieses YouTube-Video von Google Tech Talks , das AspectJ und seine Verwendung jenseits der Protokollierung ziemlich gut erklärt. Natürlich finden Sie auch hier auf stackexchange viele Beispiele, wie Sie sich anmelden können .

valenterry
quelle
0

Ich würde vorschlagen, dass Sie die Möglichkeit haben, einer bestimmten Protokolldatei mehrere Protokollierungskontexte zuzuordnen und alles, was in einen Protokollierungskontext geschrieben wurde, zu protokollieren, es sei denn, der Code fordert den Protokollierungskontext ausdrücklich auf, seinen Inhalt zu verwerfen. Solch ein Entwurf ermöglicht es einem, ziemlich detaillierte Protokolle während eines Vorgangs zu erfassen und sie zu verwerfen, wenn der Vorgang erfolgreich ist, sie jedoch verfügbar zu haben, wenn der Vorgang fehlschlägt. Wenn eine solche Protokollierungsfunktion nicht vorhanden ist, kann es erforderlich sein, dass eine Anwendung viel Zeit verschwendet, um unnötige Daten zu protokollieren, und zwar in 99,99% der Fälle, in denen alles funktioniert.

Superkatze
quelle