Drupal 7 Performance steigern, durch Abschaltung von Database Logging und Verwendung von Syslog

Drupal speichert mit den Standardeinstellungen alle System- und Fehlermeldungen mit Hilfe des Database-Logging Moduls, auch Watchdog genannt, in einer Datenbanktabelle. Bei Webseiten mit viel Inhalt und viel Benutzerinteraktion, wie oft bearbeiteten Inhalten, vielen Kommentaren, vielen Suchanfragen, usw., werden dementsprechend oft Log-Einträge in die Tabelle geschrieben. Da Schreibzugriffe auf die Datenbank wesentlich länger benötigen als Lesezugriffe, können viele Log-Einträge die Performance einer Drupal-Webseite negativ beeinflussen.

Da Drupal meist auf Linux-basierten System betrieben wird, können die Protokollnachrichten hier aber auch mit Hilfe des System-internen syslog oder rsyslog-Dienstes verwaltet werden. Somit werden die Drupal-Meldungen nicht mehr in der Drupal-Datenbank, sondern in System-eigenen Text-Files gespeichert.
 

Um Syslog zu verwenden, müssen folgende Konfigurationen im Drupal und an der Syslog-Konfiguration vorgenommen werden

Zuerst sollte in der gewünschten Drupal-Website das Syslog-Modul über die Modulverwaltung aktiviert werden. Danach stehen im Menü unter "Konfiguration / Entwicklung / Protokollierung und Fehler" oder unter dem Pfad /admin/config/development/logging die Optionen für das Modul zur Verfügung. 

Im Feld "Syslog Identity" sollte ein eindeutige Name für die aktuelle Drupal Website eingegeben werden. Dieser Wert wird später im System verwendet, um die Meldungen der aktuellen Website von anderen Sites zu unterscheiden. Hierüber können auch die Log-Einträge verschiedener Sites in verschiedene Logdateien umgeleitet werden.

Im Feld "Syslog Facility" sollte der Standardwert LOG_LOCAL0 beibehalten werden. Dieser Wert dient ebenfalls der Unterscheidung verschiedener Protokollquellen, könnte aber zum Beispiel für alle Drupal-Websites den gleichen Wert beinhalten, da diese ja bereits anhand der "Syslog Identity" unterschieden werden.

Das "Syslog Format" könnte ebenfalls noch angepasst werden, um eventuelle zusätzliche Informationen zu speichern. Im Normalfalle sollte aber der Standardwert ausreichend sein.

Nun muss dem Syslog-Dienst noch mitgeteilt werden, in welche Dateien die Drupal Log-Einträge geschrieben werden sollen. Wird dies vergessen, werden alle Drupal Messages in das Standard-Systemlogfile geschrieben. Als Beispiel verwenden wir ein Ubuntu 14 als Betriebssystem mit RSysLog. Hier sollte die Konfigurations-Datei "/etc/rsyslog.d/50-default.conf" angepasst werden. Am Ende dieser Datei sollte mindestens die folgende Zeile eingefügt werden:

local0.* /var/log/drupal.log

Mit Hilfe dieser Zeile werden alle Log-Einträge für die oben angesprochene Facility LOG_LOCAL0, in die Datei /var/log/drupal.log geschrieben.

Möchte man die Log-Dateien für verschiedene Seiten in verschieden Log-Files aufteilen, kann folgende Schreibweise des sogenannten "RainerScript" verwendet werden:

if $programname == 'drupal-site01.de' then /var/log/drupal/drupal-site01-de.log

& ~

local0.* /var/log/drupal/other.log

& ~

Weitere Informationen zu Filter-Bedingungen oder Datei-Umleitungen in der rsyslog-Konfiguration findet man unter: http://www.rsyslog.com/doc/rsyslog_conf_filter.html
Mit Hilfe des RainerScript kann auch mit Variablen gearbeitet werden, um automatisch verschiedene Dateien zu verwenden.

Jetzt muss rsyslog noch durch die Eingabe von "service rsyslog restart" oder "/etc/init.d/rsyslog restart" neugestartet werden, damit die gewünschte Konfiguration aktiviert wird.

Löst man jetzt neue Log-Einträge aus, zum Beispiel 404-Fehler durch den Aufruf nicht vorhandener Seiten, sollten diese Einträge gleichzeitig im üblichen Drupal-Protokoll und in der gewünschten Log-Datei erscheinen.

Sobald die Log-Einträge korrekt in den entsprechenden Logfiles ankommen, kann das Modul "Database Logging" im Drupal deaktiviert und deinstalliert werden. Damit erfolgen keine Schreibzugriffe mehr auf die Datenbank für Protokollnachrichten aus Drupal. Durch die Deinstallation wird auch die vorhandene Log-Tabelle "watchdog" in der Datenbank gelöscht.
 

Vor- und Nachteile der Protokollierung von Drupal-Nachrichten in System-Logfiles

Der größte Vorteil der Protokollierung mit Hilfe der System-Logfiles sind natürlich die eingesparten Schreibzugriffe auf die Datenbank und der dadurch erzielte Performance-Gewinn.

Ein weiterer Vorteil bei der Verwendung der System-Logging Methoden, ist die Möglichkeit, zentrale Log-Verwaltungstool einzusetzen. So kann zum Beispiel mit Hilfe von Logstash ein zentraler Logging-Server für verschiedene Drupal-Seiten und der dazugehörigen Systeme, wie dem Apache-Webserver, der Apache Solr Suche oder anderer Quellen aufgebaut werden. Somit lassen sich alle Nachrichten verschiedener Quellen zentral sammeln und sind dort natürlich komfortabel auswertbar und durchsuchbar und lassen sich natürlich auch automatisch weiterverarbeiten.

Ein Nachteil kann es natürlich sein, dass Redakteure und technisch nicht sehr versierte Mitarbeiter keinen einfachen Zugriff mehr auf Protokollnachrichten innerhalb Drupal haben. Dieser Nachteil kann aber mit Tools wie dem Ubuntu "Log File Viewer" oder Logstash leicht wieder ausgeglichen werden.

Ein kleinerer Nachteil ist es nicht mehr die Liste der häufigsten Suchanfragen oder zum Beispiel der häufigsten 404-Fehler im Drupal zur Verfügung zu haben. Somit können Redakteure nicht ganz so leicht eventuell benötigte Redirects nach Seitenumstellungen anlegen. Durch regelmäßige Auswertung der Log-Files sind die Daten aber natürlich problemlos abrufbar.
 

Links zum Thema Drupal und die Verwendung von Syslog

https://www.drupal.org/documentation/modules/syslog
http://www.developed.be/2013/02/26/write-drupal-logs-to-rsyslog-instead-of-to-dblog/
http://www.paulbooker.co.uk/drupal-developer/command-lines/write-drupal-logs-rsyslog

http://wiki.ubuntuusers.de/Logdateien
http://de.linwiki.org/wiki/Linuxfibel_-_System-Administration_-_Protokollierung