Laravel’ı Docker içinde PHP-FPM, Nginx ve Supervisor ile çalıştırıyorsanız, kafanızı karıştıran bir sorunla karşılaşabilirsiniz:
-
docker logshiçbir şey göstermiyor -
storage/logs/laravel.logboş - Logging doğru yapılandırılmış görünüyor
Biraz araştırmadan sonra, düzeltmenin Supervisor, PHP ve Laravel arasındaki küçük ama kritik ayarların bir kombinasyonu olduğunu öğrendim.
Bu yazı çalışır kurulumun belgelenmesidir.
Kurulum
Kurulum
- Laravel
- PHP-FPM
- Nginx
- Supervisor
- Docker
Laravel, log’ları dosyalara değil, stdout/stderr’ye kaydedilecek şekilde yapılandırılmıştır.
Supervisor log’ları stdout/stderr’ye yönlendirmeli
Supervisor log’ları stdout/stderr’ye yönlendirmeli
Bu en önemli kısımdır.
Supervisor, varsayılan olarak işlem çıktısını Docker’a yönlendirmez.
Eğer bu eksikse, log’lar sessizce kaybolur.
Her programın aşağıdaki satırları içermesine emin olun:
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
Bunu yapmadan, docker logs her zaman boş olacaktır, Laravel doğru logging yapıyor olsa bile.
Nginx yapılandırması (isteğe bağlı)
Nginx yapılandırması (isteğe bağlı)
Laravel log’ları için burada kesin bir gereklilik yoktur.
Nginx log’larının Docker içinde görünmesini istiyorsanız:
access_log /dev/stdout;
error_log /dev/stderr warn;
Aksi takdirde, bu sorun için Nginx’i göz ardı edebilirsiniz.
PHP, hataları stderr’ye kaydetmelidir
PHP, hataları stderr’ye kaydetmelidir
PHP-FPM’nin hataları Docker’ın stderr’ye yazması gerekiyor.
php.ini dosyasında (ya da bir Docker geçersiz kılmada):
log_errors=On
error_log=/proc/self/fd/2
Bu, PHP hatalarının docker log’larında görünmesini sağlar.
Asıl sorun: Laravel logging.php
Asıl sorun: Laravel logging.php
Temel sorun, Laravel’in Monolog yapılandırmasındadır.
İlk bakışta doğru gözüken bu, akış yapılandırmasının çok önemli olduğu anlamına geliyor.
Çalışan yapılandırma:
'stderr' => [
'driver' => 'monolog',
'level' => env('LOG_LEVEL', 'debug'),
'handler' => StreamHandler::class,
'formatter' => env('LOG_STDERR_FORMATTER'),
'with' => [
'stream' => 'php://stdout',
'level' => env('LOG_LEVEL', 'debug'),
],
],
Önemli noktalar:
Akış php://stdout (veya stderr) olarak açıkça belirtilmelidir.
with kullanımı yanlış olduğunda, logging sessizce bozulabilir.
Laravel, Monolog yanlış yapılandırıldığında sizi uyarmayacaktır.
Log’ların görünmemesinin temel sebebi budur.
Ortam konfigurasyonu
Ortam konfigurasyonu
Son .env ayarı:
LOG_CHANNEL=stack
LOG_STACK=stderr
LOG_LEVEL=debug
LOG_DEPRECATIONS_CHANNEL=null
Ayrıca konfigürasyon önbelleğini temizlemeyi unutmayın:
php artisan config:clear
Sonuç
Sonuç
Şu ayarlarla:
Supervisor, stdout/stderr yönlendirmekte
PHP hataları stderr’ye yazmakta
Laravel, log’ları doğru şekilde akıtmaktadır
Docker log’ları toplayabilmekte
Kaynak: Orijinal Makale


