9 Best Practices für die Protokollierung

Mar 01 2023
Die Protokollierung ist ein leistungsstarkes Tool zur Fehlerbehebung und Fehlerüberwachung. Es bietet eine Aufzeichnung von Ereignissen, die während der Ausführung eines Programms auftreten.
Eine Gruppe Holzstämme auf einem Feld

Die Protokollierung ist ein leistungsstarkes Tool zur Fehlerbehebung und Fehlerüberwachung. Es bietet eine Aufzeichnung von Ereignissen, die während der Ausführung eines Programms auftreten. Allerdings ist es nur so hilfreich wie der Inhalt und das Format selbst. Ein Protokoll, das nutzlose Informationen anzeigt, ist eine Verschwendung von Rechenleistung, Speicherplatz und Geld.

Meiner Meinung nach sollte der Holzeinschlag als Bürger erster Klasse in einem System eingestuft werden. Aus diesem Grund sollten Sie die Protokollierung als einen formellen Prozess mit bewährten Methoden und einem klaren Ziel dessen, was Sie erreichen möchten, betrachten.

Zunächst würde ich empfehlen, NICHT die Standardausgabebibliotheken zu verwenden, die Ihre Sprache bereitstellt. Normalerweise fehlen ihnen Funktionen, die Protokollierungsbibliotheken bereitstellen, und sie sollten nur beim lokalen Debuggen verwendet werden.

Hier sind einige Beispiele für Alternativen zur Standardausgabe einer Sprache:

- Node.JS Winston

- Java Log4J

- Geh Zap

Empfohlene Vorgehensweise

1. Testen Sie Ihre Protokolle

Ich meine nicht Unit-Tests. Ich meine, wenn Sie Protokolle schreiben, gehen Sie in Ihren Dienst und sehen Sie sich die Ausgabe an. Beantworten Sie die folgende Frage: Ist es das, was Sie erwartet haben? Fehlt etwas? Sind sie verständlich? Benötigen Sie mehr/weniger Kontext?

Teilen Sie es mit einem Teamkollegen und fragen Sie, ob er die Ausgabe versteht?

2. Protokollieren Sie KEINE sensiblen Informationen!

Protokollieren Sie KEINE vertraulichen Informationen. API-Schlüssel, Passwörter, Anmeldeinformationen und mehr fallen in diese Kategorie. Es ist viel zu riskant, vertrauliche Daten zu protokollieren, da sich dadurch die Wahrscheinlichkeit erhöht, dass sie durchsickern und zu einem Sicherheitsproblem werden.

❌
logger.error("Unable to log in", {request});

✅
logger.error("Unable to log in", {
  username: request.user,
  password: request.pass ? "[HIDDEN]" : null,
// any additional context needed?
})

Die Protokollierung ist nur so vorteilhaft wie die Nachricht im Protokoll. Seien Sie daher spezifisch.

❌
logger.info("We're starting!")
...
logger.info("task complete!")

✅
logger.info("Starting task", {
  name: taskName,
  params: params,
  startTime: startTime
});

logger.info("task complete", {
  response: output.response,
  event: {
    action: taskName,
    duration: currentTime - startTime
  }
})

Protokollierung kostet Geld. Die Protokolle werden normalerweise in einer Datei gespeichert und in den Speicher hochgeladen, wo sie analysiert werden können. Das kostet. Wenn Ihr System auf eine Million Anfragen reagiert, könnten Millionen und Abermillionen potenzieller Protokollereignisse gespeichert werden. Stellen Sie sicher, dass nur relevante Daten protokolliert werden.

5. Protokollieren Sie alle Fehler

Protokolle sind der beste Freund beim Debuggen. Wenn Sie sich als Programmierer also in der Situation befinden, eine Fehlerbehandlung zu schreiben, stellen Sie sicher, dass Sie den Fehler immer protokollieren, bevor Sie dem Benutzer einen anderen Fehler melden. Zum Beispiel:

catch(err) {
  logger.error('An error occured', {error: err, args: args});
  throw new SystemError('Unable to process request');
}

6. Nutzen Sie die Funktionen Ihres Loggers

Die meisten Logger verfügen über eine wirklich leistungsstarke Funktion. Protokollebenen. Dadurch können Sie Ihre Protokolle nach Kontextumgebung trennen. Produktähnliche Umgebungen zeigen nur Informationen und Fehler an. Debug-Umgebungen, alle anzeigen. Nutzen Sie auch die Umgebung für das, was sie bedeutet, verwenden Sie nicht die Info-Ebene für Fehler!

7. Verwenden Sie die „Debug“-Ebene nicht für Systemüberwachungsdaten

Manchmal überrascht es die Leute, aber Sie können nicht immer garantieren, dass die Umgebung so eingerichtet ist, dass Protokolle auf „Debug“-Ebene gedruckt werden. Wenn Sie daher wichtige Daten protokollieren, die für Dashboards verwendet werden, sollten Sie garantierte „Info“- oder „Fehler“-Ebenen verwenden.

8. Stellen Sie sicher, dass Sie Trace-IDs in den Protokollen behalten

Dieser Punkt gilt eher für verteilte Systeme, wenn Sie jedoch Trace-IDs in Ihrem System verwenden. Melden Sie sie! Es ist sehr schwierig, Fahrten durch ein System ohne sie herauszufinden!

9. Legen Sie einen Mindeststandard für das Projekt fest

Legen Sie einen Standard für die Mindestanzahl der zu protokollierenden Felder in Ihrem System fest. Dazu sollten Protokollierungslatenzen, Anforderungsdauer und Trace-IDs gehören. Ein Standard wie dieser ermöglicht es Ihnen, potenzielle Leistungsprobleme zu erkennen und sie proaktiv statt reaktiv anzugehen.