php-fpm コンテナの標準出力に PHP のアプリケーションログを出力してみた

コンテナの中に PHP アプリケーションのログを出力している場合、docker exec でコンテナの中に入るか、引数に tail -f を指定してログを確認していたりします。ローカル環境なら面倒でも確認可能ですが、コンテナの中に入れないよう制限されていたり、クラウド環境でそもそもコンテナの中に入れない場合があります。そうなると PHP アプリケーションのログ自体をコンテナの標準出力に出した方が、ローカル環境でもログ確認しやすいし、クラウド環境でもログ連携が簡単になり、良い事ばかりな気がします。そこで今回は、php-fpm コンテナの標準出力に PHP のアプリケーションログを出力する構成を検証してみました。

PHP アプリケーション:index.php

ini_set で php.ini が環境ごとに設定されている場合を想定。

<?php
  ini_set("error_log", "php://stdout");

  function logError($message) {
    $timestamp = date("Y-m-d H:i:s");
    $logMessage = "[$timestamp] $message" . PHP_EOL;
    error_log($logMessage);
  }

  phpinfo();
  
  logError("test message");
?>

nginx 設定フィアル:php.conf

nginx と php-fpm を連携します。

server {
    listen 80;

    root /var/www/html;

    location / {
        index index.php index.html index.htm;
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

コンテナの起動コマンド用スクリプト:init.sh

nginx はバックグラウンド起動して、php-fpm はフォアグランド起動します。

#!/bin/bash
set -e

nginx

php-fpm

検証用コンテナ:Dockerfile

nginx をインストールして、不要なファイルを削除したりローカルのファイルをコンテナにコピーしたり。

FROM php:8.2-fpm

RUN apt update && apt install -y nginx

RUN rm /etc/nginx/sites-enabled/default
COPY php.conf /etc/nginx/sites-enabled/

COPY index.php /var/www/html

COPY init.sh /usr/local/bin/
RUN chmod 755 /usr/local/bin/init.sh

CMD ["init.sh"]

コンテナをビルドしてローカル検証

# ビルド
docker build -t mnrphp .

# 起動したらブラウザで http://localhost/ にアクセス
docker run -d --rm --name mnrphp -p 80:80 mnrphp

# 標準出力の確認
docker logs mnrphp -f

# コンテナの中に入る場合
docker exec -it mnrphp bash

# 検証が終わったら削除
docker stop mnrphp

標準出力の結果

% docker logs mnrphp -f

[27-Aug-2023 00:56:49] NOTICE: fpm is running, pid 10
[27-Aug-2023 00:56:49] NOTICE: ready to handle connections
127.0.0.1 -  27/Aug/2023:00:56:55 +0000 "GET /index.php" 200
NOTICE: PHP message: [2023-08-27 00:56:55] test message
NOTICE: PHP message: [2023-08-27 00:57:01] test message
127.0.0.1 -  27/Aug/2023:00:57:01 +0000 "GET /index.php" 200
NOTICE: PHP message: [2023-08-27 00:57:02] test message
127.0.0.1 -  27/Aug/2023:00:57:02 +0000 "GET /index.php" 200

参考

https://github.com/docker-library/php/tree/a01c2d9b513441e8ad34a15e31be87ab8d18dfe1/8.2/bookworm/fpm

タグ: ,