Skip to main content

Logging

Serverseitiges Logging​

Serverseitig wird im jadice web toolkit das Logging der jadice document platform 5 eingesetzt, das das Anbinden unterschiedlicher Frameworks erlaubt.

Eine ausführliche Beschreibung kann der Dokumentation der jadice document platform 5entnommen werden.

Clientseitiges Logging​

Auf der Clientseite wird das Logging auf das von GWT unterstützte java.util.logging umgeleitet. Die Logging-Konfiguration kann in den jeweiligen .gwt.xml Dateien der Module modifiziert werden:

  • Loglevel setzen: <set-property name="gwt.logging.logLevel" value="SEVERE"/>. Hier können die Loglevel von java.util.logging verwendet werden, die das Webtoolkit unterstützt: FINEST, FINER, FINE, CONFIG, INFO, WARNING, SEVERE Als Default ist im jadice web toolkit WARNING gesetzt.

  • Console- und RemoteHandler aktivieren: <set-property name="gwt.logging.consoleHandler" value="ENABLED"/>. consoleHandler und simpleRemoteHandler können über das Attribut ENABLED bzw. DISABLED aktiviert bzw. deaktiviert werden. Per Default ist im jadice web toolkit der consoleHandler aktiviert und der simpleRemoteHandler deaktiviert.

  • Falls GWT Logging bereits genutzt wird, kann integrationsseitig das im JWT voreingestellte Loglevel durch folgende Reihenfolge in der .gwt.xml Datei überschrieben werden: `

    `

In der gewünschten Klasse kann nun über Logger logger = LoggerFactory.getLogger(classname.class) ein Logger instanziiert werden. Dieser übernimmt die Konfigurationen der zugehörigen .gwt.xml Datei. Über verschiedene Methoden können dann Messages auf verschiedenen Levels geloggt werden:

Methodejava.util.logging Level
logger.trace(String message, Throwable t)FINEST
logger.debug(message, t)CONFIG
logger.info(message, t)INFO
logger.warn(message, t)WARNING
logger.error(message, t)SEVERE

Der Parameter t ist dabei optional.

Weitere Informationen können unter GWT Logging gefunden werden.

Remote-Logging (Client → Server)​

Clients können Log-Meldungen über die Transport-Verbindung an den Server senden (Nachricht LOG_REMOTE); beim GWT-Client geschieht das bei aktiviertem simpleRemoteHandler (s.o.). Serverseitig nimmt der RemoteLoggingMessageListener die Meldungen entgegen und schreibt sie mit dem übermittelten Loglevel in das Server-Log. Ein mitgesendetes Throwable wird dabei serverseitig rekonstruiert.

Inhalt, Loglevel und Client-ID solcher Meldungen sind vollständig vom Client kontrolliert. Der Server härtet die Verarbeitung deshalb wie folgt ab:

  • Sanitisierung (Log-Injection, CWE-117): Steuerzeichen einschließlich Zeilenumbrüchen (CR/LF) werden durch Leerzeichen ersetzt. Eine Meldung belegt damit immer genau eine Log-Zeile und kann keine fremden Log-Einträge vortäuschen. Meldungen werden auf 4096 Zeichen gekürzt (Markierung …[truncated]). Jede Meldung erhält das Präfix [remote-client:<clientId>]; die Client-ID wird ebenfalls sanitisiert.
  • Drosselung (Flooding): Pro Client-ID werden höchstens 100 Meldungen pro Sekunde verarbeitet. Darüber hinausgehende Meldungen werden verworfen; der Client erhält dennoch eine Bestätigung, der Fire-and-forget-Vertrag bleibt also erhalten. Die Grenzwerte sind nicht konfigurierbar.
  • Begrenzte Throwable-Rekonstruktion: Mitgesendete Exceptions werden auf 25 verkettete Ursachen (cause) und 1024 Stacktrace-Elemente begrenzt; ein fehlender Stacktrace wird toleriert. Fehler bei der Verarbeitung, auch Error-Instanzen wie StackOverflowError, werden abgefangen und beenden nicht den Worker-Thread.
  • Abschaltbar: Über ConfigurationManager.getServerConfiguration().setRemoteLoggingEnabled(false); (Spring-Property webtoolkit.remoteLoggingEnabled, Default true) lässt sich die serverseitige Verarbeitung vollständig deaktivieren. Remote-Meldungen werden dann quittiert, aber nicht ins Log geschrieben.

Sanitisierung und Drosselung greifen unabhängig von diesem Schalter immer. Integrationen, die kein Remote-Logging nutzen, sollten den Schalter in Produktion auf false setzen: Das Server-Log enthält dann keine vom Client frei wählbaren Inhalte (Relevanz für DSGVO Art. 32 und Log-Integrität nach ISO 27001).

Beispiel application.yml:

webtoolkit:
remoteLoggingEnabled: false