Da mir das Thema Logging in TYPO3 im Rahmen der Kommunikation mit Webhostern auch schon unter gekommen ist, habe ich das jetzt mal technisch genauer analysiert und möchte das hier im Detail festhalten.
Kurzfassung
Häufig wissen Webhoster nicht, dass PHP-Fehler (oder andere PHP-Meldungen), die in TYPO3 eintreten, im Standardfall nicht unter dem Standard-Pfad aus der PHP-Konfiguration zu finden sind. TYPO3 fängt diese Fehler nämlich i. d. R. ab und protokolliert sie unter var/log/typo3_<hashwert>.log
des Projektverzeichnisses.
Sehen wir und das mal genauer an:
php.ini
Normalerweise ist es so, dass du in der php.ini
, also der PHP-Konfiguration des Servers, mit Hilfe der Eigenschaft error_log
einen Pfad angeben kannst, unter welchem PHP-Fehler protokolliert werden sollen.
Beispiel Mittwald:
Bei Mittwald ist es beispielsweise möglich, eine eigene php.ini
-Datei zu nutzen. Dort liegt die Datei unter /home/www/pXXXXXX/etc/php/php.ini
und enthält standardmäßig den folgenden Pfad:
error_log = /tmp/php_errors.log
Offenbar verwendet Mittwald hier einen relativen Pfad. Der absolute Pfad würde so aussehen: /home/www/pXXXXXX/tmp/php_errors.log
.
.htaccess
Alternativ zur Konfiguration über die php.ini
Datei ist es, je nach Server, möglich, den Wert über die .htaccess
Datei überschreiben zu lassen. In diesem Fall würde man, wie von dir oben genannt, folgendes schreiben können, um die Eigenschaft error_log
der PHP-Konfiguration auf Verzeichnis-Ebene zu überschreiben:
php_value error_log /dein/absoluter/pfad/php_errors.log
TYPO3
TYPO3 verwendet nun standardmäßig einen Error Handler, der sich darum kümmert, jegliche PHP-Fehler oder -Meldungen abzufangen und zu protokollieren.
Schauen wir uns einmal die Standard-Konfiguration an, welche greift, wenn nichts anders in config/system/settings.php
oder config/system/additional.php
definiert wurde (In TYPO3 < 12: public/typo3conf/LocalConfiguration.php
oder public/typo3conf/AdditionalConfiguration.php
).
Diese ist zu finden unter EXT:core/Configuration/DefaultConfiguration.php
und enthält (in TYPO3 12) folgende Angaben:
'LOG' => [
'writerConfiguration' => [
\Psr\Log\LogLevel::WARNING => [
\TYPO3\CMS\Core\Log\Writer\FileWriter::class => [],
],
],
'TYPO3' => [
'CMS' => [
'Core' => [
'Resource' => [
'ResourceStorage' => [
'writerConfiguration' => [
\Psr\Log\LogLevel::ERROR => [
\TYPO3\CMS\Core\Log\Writer\FileWriter::class => [],
\TYPO3\CMS\Core\Log\Writer\DatabaseWriter::class => [],
],
],
],
],
],
'deprecations' => [
'writerConfiguration' => [
\Psr\Log\LogLevel::NOTICE => [
\TYPO3\CMS\Core\Log\Writer\FileWriter::class => [
'logFileInfix' => 'deprecations',
'disabled' => true,
],
],
],
],
],
],
],
ich möchte hier nicht zu tief ins Detail gehen aber man kann erkennen, dass je nach Kontext (global oder für bestimmte Extensions wie etwa EXT:core
) und je nach Schweregrad Konfigurationen angelegt werden können.
Die Folgenden Schweregrade können laut vendor/psr/log/Psr/Log/LogLevel.php
(verwendet im ErrorHandler
) vorkommen (in absteigender Reihenfolge):
- EMERGENCY
- ALERT
- CRITICAL
- ERROR
- WARNING
- NOTICE
- INFO
- DEBUG
Im folgenden Abschnitt der Standardkonfiguration sehen wir, dass für den Schweregrad WARNING
eine globale Konfiguration existiert:
'LOG' => [
'writerConfiguration' => [
\Psr\Log\LogLevel::WARNING => [
\TYPO3\CMS\Core\Log\Writer\FileWriter::class => [],
],
],
/* ... */
Laut Dokumentation greift eine Konfiguration immer für den gesetzten Schweregrad oder einen höheren. Dementsprechend können wir sagen, dass TYPO3 standardmäßig fehler der Schweregrade: EMERGENCY
, ALERT
, CRITICAL
, ERROR
und WARNING
selbst behandelt und nicht unter dem Standard-Pfad aus der PHP-Konfiguration protokolliert.
Darüber hinaus können wir sehen, dass standardmäßig der FileWriter verwendet wird, der sich darum kümmert, die Fehler in eine Datei zu schreiben. Demgegenüber würde es beispielsweise auch noch den PhpErrorLogWriter geben, der den Standard-Pfad der PHP-Konfiguration bzw. die Funktion error_log()
in PHP nutzen würde, um Fehler mit zu schreiben.
Im Rahmen der FileWriter-Konfiguration werden keine weiteren Angaben gemacht (leeres Array als Wert). Dies führt dazu, dass der Standard-Pfad des FileWriter für Protokolle verwendet wird. Diesen kann man in der Klassen-Datei des FileWriter EXT:core/Classes/Log/Writer/FileWriter.php
direkt nachsehen:
protected string $defaultLogFileTemplate = '/log/typo3_%s.log';
Vorangestellt wird dann noch der Pfad aus Environment::getVarPath()
, der je nach Installation typo3temp/var/
oder var/
sein kann.
In einer Composer-Installation, die öffentliche Dateien in einem dedizierten Unterverzeichnis public
vorsieht würde der Log-Pfad (ausgehend vom Projektverzeichnis) also so aussehen können: var/log/typo3_6711ae678f.log
.