Rejestrowanie błędów i dobre praktyki
Rejestruj błędy w plikach i stosuj wzorce obsługi błędów odpowiednie dla środowiska produkcyjnego
Rejestrowanie błędów i dobre praktyki to bezpłatna lekcja PHP Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej PHP Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs PHP Academy zawiera 4 lekcji w sumie.
Dlaczego rejestrowanie błędów ma znaczenie
W środowisku produkcyjnym nie można wyświetlać błędów użytkownikom, ale nadal trzeba wiedzieć, kiedy coś pójdzie nie tak. Rejestrowanie zapisuje szczegóły błędów w plikach lub usługach, dzięki czemu można je później przeanalizować.
error_log()
Najprostsza funkcja rejestrowania — zapisuje komunikat w dzienniku błędów PHP:
<?php
error_log('User login failed for: ' . $email);
error_log('DB query took: ' . $duration . 'ms');
// Send to email (not recommended for high traffic)
error_log('Critical: server out of memory', 1, 'admin@example.com');Rejestrowanie strukturalne
Rejestruj dane strukturalne w formacie JSON, aby ułatwić ich analizowanie i przeszukiwanie:
<?php
function logEvent(string $level, string $message, array $context = []): void {
$entry = array_merge([
'ts' => date('c'),
'level' => $level,
'message' => $message,
], $context);
error_log(json_encode($entry));
}
logEvent('ERROR', 'Payment failed', [
'order_id' => 123,
'amount' => 99.99,
'user_id' => 45,
]);Poziomy rejestrowania (PSR-3)
Standard PSR-3 definiuje poziomy rejestrowania:
- emergency — system nie działa
- alert — należy natychmiast podjąć działanie
- critical — stan krytyczny
- error — błędy czasu wykonywania
- warning — nietypowe zdarzenia, które nie są błędami
- notice — normalne, ale istotne zdarzenia
- info — komunikaty informacyjne
- debug — szczegółowe informacje debugowania
Rejestrator Monolog
Monolog to standardowa biblioteka PHP do rejestrowania, zgodna z PSR-3:
<?php
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
$log = new Logger('app');
$log->pushHandler(new StreamHandler('/var/log/app.log', Logger::DEBUG));
$log->info('User logged in', ['user_id' => 42]);
$log->error('Payment failed', ['order' => 99, 'reason' => 'card_declined']);
$log->warning('Slow query', ['duration_ms' => 3200]);Obsługa wyjątków w środowisku produkcyjnym
Moduł obsługi wyjątków gotowy do użycia w środowisku produkcyjnym, który rejestruje błędy i zwraca bezpieczną odpowiedź:
<?php
set_exception_handler(function(\Throwable $e) {
$id = uniqid('err_');
error_log(json_encode([
'error_id' => $id,
'class' => get_class($e),
'message' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'trace' => $e->getTraceAsString(),
]));
http_response_code(500);
echo json_encode(['error' => 'Server error', 'id' => $id]);
exit(1);
});Rotacja dzienników
Pliki dzienników rosną bez ograniczeń — rotuj je za pomocą logrotate w systemie Linux lub opartych na czasie modułów obsługi w Monolog:
<?php
use Monolog\Handler\RotatingFileHandler;
$handler = new RotatingFileHandler(
'/var/log/app.log',
30, // keep 30 days
Logger::DEBUG
);
// Creates dated files: app-2024-05-27.log
$log = new Logger('app');
$log->pushHandler($handler);Rejestrowanie z pełnym kontekstem
Dodawaj kontekst żądania do każdego wpisu w dzienniku, aby ułatwić debugowanie:
<?php
function getRequestContext(): array {
return [
'url' => $_SERVER['REQUEST_URI'] ?? '',
'method' => $_SERVER['REQUEST_METHOD'] ?? '',
'ip' => $_SERVER['REMOTE_ADDR'] ?? '',
'user_id' => $_SESSION['user_id'] ?? null,
];
}
// Add to every log call:
$log->error('Order failed', array_merge(
getRequestContext(),
['order_id' => $orderId]
));Unikanie danych wrażliwych w dziennikach
Nigdy nie rejestruj informacji wrażliwych:
- Haseł i tokenów
- Numerów kart kredytowych
- Danych osobowych (zgodność z RODO)
- Pełnych śladów stosu wyjątków w odpowiedziach wyświetlanych użytkownikom
<?php
// Bad:
error_log('Login attempt: ' . $email . ' / ' . $password);
// Good:
error_log('Login failed for user: ' . substr($email, 0, 3) . '***');Sentry i zewnętrzne śledzenie błędów
W środowisku produkcyjnym korzystaj z usług śledzenia błędów, takich jak Sentry, aby centralizować informacje o błędach i otrzymywać o nich alerty:
<?php
// After composer require sentry/sdk
\Sentry\init(['dsn' => getenv('SENTRY_DSN')]);
// Automatic capture of unhandled exceptions
// Manual capture:
try {
processOrder();
} catch (\Throwable $e) {
\Sentry\captureException($e);
throw $e;
}Warunki wstępne oparte na asercjach
Używaj asercji do wykrywania błędów programistycznych podczas tworzenia aplikacji:
<?php
// assert() throws AssertionError when false (dev mode)
assert(is_int($userId), 'userId must be an integer');
assert($amount > 0, 'amount must be positive');
// Or throw explicitly:
if (!is_int($userId)) {
throw new \InvalidArgumentException('userId must be int');
}Szybki test
Który poziom rejestrowania według PSR-3 wskazuje sytuację wymagającą natychmiastowej uwagi?
Podsumowanie: rejestrowanie błędów
Dobre praktyki rejestrowania:
- Stosuj strukturalne rejestrowanie w formacie JSON z datą i godziną, poziomem, komunikatem i kontekstem
- Przestrzegaj poziomów rejestrowania PSR-3
- W aplikacjach produkcyjnych używaj Monolog
- Rotuj dzienniki, aby zapobiec zapełnieniu dysku
- Nigdy nie rejestruj haseł ani danych wrażliwych
- Korzystaj z Sentry lub podobnego narzędzia do śledzenia błędów w czasie rzeczywistym
Często zadawane pytania
Czy lekcja „Rejestrowanie błędów i dobre praktyki” jest bezpłatna?
Tak — pełny tekst „Rejestrowanie błędów i dobre praktyki” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu PHP Academy, przejdź na CoddyKit PRO. Kurs PHP Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Rejestrowanie błędów i dobre praktyki”?
Rejestruj błędy w plikach i stosuj wzorce obsługi błędów odpowiednie dla środowiska produkcyjnego Ćwiczysz PHP Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć PHP Academy?
Nie wymagamy żadnego doświadczenia. PHP Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Rejestrowanie błędów i dobre praktyki”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji PHP Academy?
Tak. Każda lekcja PHP Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Typy błędów PHP i raportowanie
- Try, catch i finally
- Tworzenie własnych wyjątków
- Rejestrowanie błędów i dobre praktyki