✏️

Docker + Laravel でアプリケーションログを Docker logs に出力する

2024/07/08に公開

環境

  • 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
    
    • ↑ 二つを設定を有効にする説明もあるけど結局不要だった

色々やってだめだったが

  1. FPM のログ出力先を変更
    • /var/log/php-fpm.log を指定するとログはファイルに書き出された
    • /dev/stderr/proc/self/fd/2 を指定したが出ない
    • nginx | php-fpm のマスタープロセスの実行ユーザが root だと出ない?(permission denied も出ない?)
  2. Laravel config/logging.php の stderr を指定
    • 前項の /dev/stderr で出ないので、これもダメなのは解る
      .env
      LOG_CHANNEL=stack
      LOG_STACK=stderr
      
  3. Laravel 抜きの最小構成で試したら Docker logs に出力された
    public/info.php
    <?php
        error_log('test log'); → ログが出た
    
        $v = 5 / 0; → 例外スタックトレースも出た
    ?>
    
  4. Laravel config/logging.php の errorlog を指定すると Docker logs に出力された

Discussion