✏️
Docker + Laravel でアプリケーションログを Docker logs に出力する
環境
- Docker (Nginxの公式イメージ nginx:bookworm)
- PHP-FPM (PHP8.3)
- Docker compose は未使用
- Nginx イメージに直接 apt install した
- Laravel(11.x)
何もしないとどうなるか?
- Webアプリに接続すると、Docker logs はアクセスログを出力する
- 多分 nginx の access_log
- Webアプリ(Laravel)内で logger('debug') や Log::notice('notice') を実行しても、Docker logs には何も出力されない
とりあえず出す方法
- Laravel のログ出力チャンネル/スタックに errorlog を指定する
- 出力先を複数指定する場合.env
LOG_CHANNEL=stack LOG_STACK=errorlog,single,...
- 出力先が一つで良い場合.env
LOG_CHANNEL=errorlog LOG_STACK=
- 出力先を複数指定する場合
- FPM の設定は変更不要/etc/php/8.3/fpm/pool.d/www.conf
;catch_workers_output = yes ;decorate_workers_output = no
- ↑ 二つを設定を有効にする説明もあるけど結局不要だった
色々やってだめだったが
- FPM のログ出力先を変更
- /var/log/php-fpm.log を指定するとログはファイルに書き出された
- /dev/stderr や /proc/self/fd/2 を指定したが出ない
- nginx | php-fpm のマスタープロセスの実行ユーザが root だと出ない?(permission denied も出ない?)
- Laravel config/logging.php の stderr を指定
- 前項の /dev/stderr で出ないので、これもダメなのは解る.env
LOG_CHANNEL=stack LOG_STACK=stderr
- 前項の /dev/stderr で出ないので、これもダメなのは解る
- Laravel 抜きの最小構成で試したら Docker logs に出力されたpublic/info.php
<?php error_log('test log'); → ログが出た $v = 5 / 0; → 例外スタックトレースも出た ?>
- Laravel config/logging.php の errorlog を指定すると Docker logs に出力された
Discussion