Logging

Siehe auch

  • Graylog

Writing Application Logs - Best Practices

Was kann man beachten, falls eine selbstgeschriebene PHP- oder Python-Applikation ihr Verhalten protokollieren soll?

Zunächst einmal sollte man die Entscheidung treffen, ob die Nutzung der Applikation mehr aus Sicht des Marketings oder der Technik protokolliert werden soll. Sollen Marketing-Aussagen getroffen werden, bietet sich mit Matomo eine selbst-gehostete Alternative zu Google Analytics an.

Ist der Entscheid für ein technisches, diagnostisches Logging getroffen, empfehlen wir den Einsatz eines zenralisierten Log-Servers, beispielsweise auf Basis von Graylog, mit passender und datenschutztauglicher Retention Time.

Dann sollten einige Regeln für das Logging der Nachrichten definiert werden:

Grund

Ziel definieren, was mit Hilfe des Loggings erreicht werden soll. Möchte man Power-User identifizieren? Möchte man sehen, welche Teile der Applikation besonders nachgefragt werden? Sollen Performance-Aussagen getroffen werden können, zum Beispiel bei Datenbank-Abfragen? Mit der passenden Fragestellung entscheidet sich, welche Daten zu loggen sind.

Umfang

Definieren, was und in welchen Einheiten etwas zu protokollieren ist, sprich: welche Felder sollen gespeichert werden. Weniger ist mehr. Genau festlegen, was man wirklich benötigt - nicht nur aus Datenschutz-, sondern auch aus Performancegründen. Angaben wie Timestamp, Servername usw. werden automatisch durch Graylog gesetzt. Die Applikation sollte dagegen Internas wie Benutzername, dessen Aktion, bei Bedarf auch deren Dauer und das Ergebnis protokollieren. Entscheidung treffen, ob die umliegenden oder ausführenden Proxy- und Webserver ihre Log-Daten ebenfalls einsenden sollen, oder ob die PHP-Applikation die gewünschten Angaben liefert - falls der Webserver seine Log-Rohdaten sendet, können einige Log-Ausgaben in der Applikation gespart werden.

Kontext

Log-Nachrichten brauchen mindestens einen Kontext - es müssen also genügend Daten gesendet werden, damit statistische Aussagen getroffen und Datensätze gruppiert werden werden können, beispielsweise auf Basis des Benutzernamens, des Mandanten und der Aktion.

Standards

Log-Nachrichten standardisieren. Alle Entwickler sollten sich darüber einig sein, ob sie den Benutzernamen oder eine Benutzer-ID im Feld „username“ speichern oder wie z.B. das Feld für den Request heissen soll - „request“ oder „requestURI“. Auch das Format und die Sprache der Freitext-Nachricht sollte festgelegt sein.

Log-Framework

Entscheid für ein Logging Framework treffen. Bei PHP bietet sich gelf-php an (https://github.com/bzikarsky/gelf-php).

Log-Format

Log-Daten im JSON-Format senden. Beispiel:

{
  "user": "alice@acme.com",
  "org": "acme inc.",
  "action": "docconvert",
  "result": 1,
  "message": "pdf created",
  "file": "spooler/test.pdf",
  "duration": 14
}
Datenschutzerklärung

Am Ende muss die Datenschutz-Erklärung angepasst werden, um den Benutzern mitzuteilen, was für wie lange protokolliert wird.

Built on 2022-06-03