Fehler-Monitoring für Symfony.

Mit sentry/sentry-symfony meldet deine Symfony-Anwendung Ausnahmen aus Controllern, Befehlen und dem Messenger an Fehlo. Das Flex-Rezept erledigt den größten Teil.

Stand: 24.10.2026, sentry/sentry-symfony 5.14.0 mit sentry/sentry 4.34, Symfony 5.4 bis 8. Das PHP-SDK haben wir noch nicht selbst gegen Fehlo laufen lassen; es spricht dasselbe Protokoll wie die getesteten SDKs.

1. Paket installieren

Terminal
composer require sentry/sentry-symfony

Das Flex-Rezept registriert das Bundle in config/bundles.php, nur für die Umgebung prod, und legt config/packages/sentry.yaml an. Das Rezept liegt in recipes-contrib; wendet Flex es nicht an, erlaubst du Contrib-Rezepte mit composer config extra.symfony.allow-contrib true und installierst neu.

2. DSN setzen

.env.local
###> sentry/sentry-symfony ###
SENTRY_DSN="https://<key>@app.fehlo.de/<project-id>"
###< sentry/sentry-symfony ###

In Produktion setzt du SENTRY_DSN besser als echte Umgebungsvariable. Die Konfiguration aus dem Rezept, mit ausdrücklich abgeschalteten personenbezogenen Daten:

config/packages/sentry.yaml
when@prod:
    sentry:
        dsn: '%env(SENTRY_DSN)%'
        options:
            send_default_pii: false
            ignore_exceptions:
                - 'Symfony\Component\ErrorHandler\Error\FatalError'
                - 'Symfony\Component\Debug\Exception\FatalErrorException'

Die Umgebung kommt aus %kernel.environment%, das Release aus der Umgebungsvariablen SENTRY_RELEASE.

3. Testen

Das Bundle hat einen Testbefehl. Weil es nur in prod registriert ist, rufst du ihn dort auf:

Terminal
APP_ENV=prod php bin/console sentry:test

Er antwortet mit „Message sent successfully with ID …“, und die Nachricht erscheint in Fehlo. Für einen echten Stacktrace legst du eine Route an, die eine Ausnahme wirft:

src/Controller/FehloTestController.php
<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Attribute\Route;

class FehloTestController extends AbstractController
{
    #[Route('/_fehlo-test', name: 'fehlo_test')]
    public function test(): never
    {
        throw new \RuntimeException('Fehlo test error');
    }
}

Leer nach Änderungen an der YAML-Datei den Cache: APP_ENV=prod php bin/console cache:clear.

Monolog

Willst du Log-Einträge ab ERROR als Fehler sehen, auch wenn keine Ausnahme fliegt, häng den Monolog-Handler des SDK ein. Schalte dann den Error-Listener des Bundles ab, sonst kommen Ausnahmen doppelt an:

config/packages/sentry.yaml
when@prod:
    sentry:
        register_error_listener: false
        register_error_handler: false

    monolog:
        handlers:
            sentry:
                type: service
                id: Sentry\Monolog\Handler

    services:
        Sentry\Monolog\Handler:
            arguments:
                $hub: '@Sentry\State\HubInterface'
                $level: !php/const Monolog\Logger::ERROR
                $fillExtraContext: true

Datenschutz

send_default_pii ist standardmäßig false: keine Header, Cookies, IP-Adressen und kein angemeldeter Nutzer. Adresse und Query-String der Anfrage gehen immer mit. Seit sentry/sentry 4.33 gibt es zusätzlich data_collection. Setz data_collection nicht: Sobald es gesetzt ist, gelten dessen freizügigere Standards, und das SDK sendet IP-Adressen, Cookies und Bodies mit. Fehlo entfernt die Absender-IP auf dem Server und filtert E-Mail-Adressen, Passwörter und Tokens.

Häufige Fragen

Warum kommen im Entwicklungsmodus keine Fehler an?

Das Flex-Rezept registriert das Bundle nur für prod. Zum Testen lokal rufst du den Testbefehl mit APP_ENV=prod auf oder trägst das Bundle in config/bundles.php für alle Umgebungen ein.

Funktioniert das mit Shopware?

Ja, Shopware ist eine Symfony-Anwendung. Für Shopware nimmst du zusätzlich das Bundle der Friends of Shopware, siehe Shopware einrichten.

Es kommt nichts an. Was prüfe ich?

Erstens den DSN: Er muss auf app.fehlo.de zeigen. Zweitens, ob dein Server oder Browser https://app.fehlo.de erreicht (Firewall, Proxy, Werbeblocker). Drittens, ob dein Kontingent für den Monat aufgebraucht ist; dann bekommst du eine Mail. Viertens, ob sampleRate oder beforeSend Ereignisse verwirft. Fehlen nur Performance-Daten, sind vielleicht die Transaktionen des Monats aufgebraucht.