Laravel використовує Monolog, а писати в лог можна через фасад Log чи хелпер logger():
use Illuminate\Support\Facades\Log;
Log::info('Замовлення оформлено', ['order_id' => $order->id]);
Log::warning('Платіжний шлюз відповідає повільно', ['ms' => $elapsed]);
Log::error('Не вдалося надіслати рахунок', ['order_id' => $order->id]);
logger('Коротке налагоджувальне повідомлення'); // рівень debug
Рівні логування (за RFC 5424, від найважливішого):
| Рівень | Коли використовувати |
|---|---|
emergency |
система непрацездатна |
alert |
потрібна негайна дія (база недоступна) |
critical |
критична помилка компонента |
error |
помилка, що не зупиняє застосунок, але потребує уваги |
warning |
щось незвичне, але не помилка (повторна спроба, повільна відповідь) |
notice |
нормальна, але важлива подія |
info |
звичайні події: вхід користувача, оформлення замовлення |
debug |
подробиці для налагодження |
Мінімальний рівень задається для каналу (змінна LOG_LEVEL). На продакшені зазвичай info чи warning: повідомлення debug просто відкидаються, не засмічуючи лог.
Другий аргумент - контекст: масив з даними, а не склеєний рядок.
// погано: неможливо шукати й фільтрувати
Log::info("Order {$order->id} paid by {$user->email}");
// добре: структуровані дані
Log::info('Order paid', ['order_id' => $order->id, 'user_id' => $user->id]);
Структуровані дані легко шукати в системах збору логів, і повідомлення лишається однаковим для всіх подій цього типу.
Куди пишеться: за замовчуванням у storage/logs/laravel.log (канал stack з single). Канали налаштовуються в config/logging.php.
Чого не писати в лог: паролі, токени, повні номери карток, персональні дані понад необхідне. Логи часто мають ширший доступ, ніж база даних, і зберігаються довше.
Не плутати з dd() і dump(): вони виводять у відповідь і для продакшену не підходять, а лог працює і в черзі, і в консольних командах, і без браузера.