PHPのDockerコンテナで error_log をファイルに出力させる方法

PHPのDockerコンテナで error_log をファイルに出力させる方法

はじめに

今回の記事では、PHP の Docker コンテナ内でerror_logで指定した出力を任意のテキストファイルに書き込む方法についてまとめていきます。

開発環境

  • Docker: version 23.0.6, build ef23cbc
  • PHP: version 8.1.9
  • Composer: version 2.5.7
  • User Docker Image: php:8.1.9-apache-bullseye

Docker の環境構築には Devcontainer を使用し、コンテナに Visual Studio Code がアタッチされてからの手順となっています。

Devcontainer を使用した開発環境の構築は別途記事に記載するものとし、本記事では割愛します。

事前準備

ログファイルを出力させるディレクトリを確認します。適宜ご自身の環境に合わせてください。

├── public # プロジェクトルート
│   ├── index.php # ログの出力をテストするファイル
│   ├── logs # ini_set('error_log', '出力先 + ファイル名') で指定するディレクトリ

php.ini

php.iniの設定に以下の記述を追記します。

# エラーメッセージを、サーバーのエラーログまたはerror_logに記録するかどうかを指定する
log_errors = on
# 標準エラー出力の出力先を指定
error_log = /dev/stderr

/dev/stderrは、Linux とその他の UNIX 系オペレーティングシステムで定義されている特殊なファイルで、標準エラー出力(通常はエラーメッセージが出力される)を指します。

そして Docker 環境では、この標準エラー出力がdocker logsコマンドで表示されるログになります。

docker logsコマンドで確認できるように設定していますが、後にini_set('error_log', '出力先 + ファイル名')で出力先の設定を上書きするように指定します。

ログを出力させる設定

index.phpを以下のように記述します。

"index.php"
ini_set('log_errors', 'on');
ini_set('error_log', __DIR__ . '/logs/php.log');

error_log("ログ出力テスト: index.php");

コンテナを起動

PHP の Docker コンテナを起動して、ログを出力するファイルにアクセス権を付与します。

$ touch public/logs/php.log

$ sudo chmod 777 -R public/logs

$ ls -la
drwxrwxrwx 2 user01 user01  4096  67 23:21 logs/

$ ls -la logs
-rwxrwxrwx 1 user01 user01    0 Jun  7 23:37 php.log

ブラウザから指定のファイルにアクセスするか、コマンドからphp index.phpで PHP スクリプトを実行します。

php-error_log.gif

指定したファイルにログが出力される事が確認できると思います。

php.iniを確認しても、ini_setメソッドで指定した出力先が指定されている事が分かります。

画像の表の左側がini_setで上書きされたファイルパスで、右側がphp.iniで指定した出力先のパスになります。

php-ini

参考記事