はじめに
今回の記事では、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
を以下のように記述します。
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 6月 7 23:21 logs/
$ ls -la logs
-rwxrwxrwx 1 user01 user01 0 Jun 7 23:37 php.log
ブラウザから指定のファイルにアクセスするか、コマンドからphp index.php
で PHP スクリプトを実行します。
指定したファイルにログが出力される事が確認できると思います。
php.ini
を確認しても、ini_set
メソッドで指定した出力先が指定されている事が分かります。
画像の表の左側がini_set
で上書きされたファイルパスで、右側がphp.ini
で指定した出力先のパスになります。