Laravel errors loggen in Slack

Een artikel hoe je Laravel foutmeldingen kan versturen naar Slack, in Laravel versie 11 en 12.
Lagere Laravel versies
Hoewel er verschillen zijn met afhandelen van fouten in eerdere versies van Laravel is het artikel grotendeels bruikbaar.
- Docs oudere versie: https://laravel.com/docs/10.x/errors#the-exception-handler
- Locatie waar de fouten afvangt,
app/Exceptions/Handler.php
Slack webhook URL aanmaken
Uiteraard moet je eerst een Slack account hebben. Daarnaast moeten we een Slack Webhook URL hebben, deze maak je als volgt aan:
- Ga naar de volgende URL https://api.slack.com/apps
- Klik op de button 'Create an App'
- Kies bij de volgende optie op 'From scratch'
- Geef een naam en de workspace op waarop je de meldingen op wilt ontvangen
- Klik daarna in het linkermenu (onder Features) op 'Incomming Webhooks'
- Zet deze nu aan, door op het schuifje op 'On' te zetten.
- Klik vervolgens op de button 'Add New Webhook to Workspace' op deze pagina
- Selecteer op het volgende scherm het kanaal waar de foutmeldingen op moeten binnenkomen.
- Als dat is gedaan, zal je zien dat er een webhook is aangemaakt
Webhook URL toevoegen aan Laravel
Om meldingen in Slack te kunnen ontvangen hoef je helemaal zelf niets meer te installeren, dat zit standaard al in Laravel.
Wat je wel moet doen is de aangemaakte webhook URL toevoegen aan je .env
bestand
LOG_SLACK_WEBHOOK_URL=https://hooks.slack.com/services/......
Foutmeldingen naar Slack sturen
Je kan nu wel meldingen op Slack krijgen doorbijvoorbeeld
<?php
Log::channel('slack')->info('test berichtje');
Maar foutmeldingen gaan standaard nog niet naar Slack.
withExceptions
In de method withExceptions
in het bestand bootstrap/app.php
kunnen foutmeldingen worden afgevangen.
Hierbij een voorbeeldje hoe we deze foutmeldingen naar Slack kunnen versturen.
- We willen dit alleen op productie hebben.
- Bij deze optie worden alleen de kritieke foutmeldingen naar Slack verzonden, je kan dit uiteraard aanpassen.
->withExceptions(function (Exceptions $exceptions) {
if (config('app.env') === 'production') {
$exceptions->render(function (Throwable $e, Request $request) {
if ($e->getStatusCode() >= 500) {
Log::channel('slack')->error($e->getMessage());
}
});
}
})
Testen
We kunnen dit lokaal eerst even testen door de if statement if (config('app.env') === 'production') {
weg te halen.
Vervolgens zet je ergens op een pagina de volgende code:
abort(500, 'Test bericht');
Roep deze pagina nu aan in je browser, in Slack zou je nu dit 'Test bericht' moeten zien.