PHP error_logが出力されない原因と対策について解説
PHPのerror_log
関数が出力されない原因として、設定ミスやファイルのパーミッション、ログ出力先の指定誤りなどが考えられます。
この記事では、エラーログが表示されない理由を整理し、各ポイントを順に確認する方法や対策を解説します。
これにより、問題発生時のトラブルシューティングがしやすくなる情報を提供します。
PHP設定の確認
php.iniでのerror_log設定
設定値の確認とサンプル記述
PHPのエラーログ出力は、php.iniの設定値によって制御されます。
以下の項目を中心に設定値を確認してください。
error_log
… ログファイルの出力先パスを指定しますlog_errors
… エラーをログに書き込むかどうかの設定を行いますerror_reporting
… ログに出力されるエラーの種類を定義します
具体例として、php.iniに以下のような記述が行われているか確認します。
; エラーログの出力先を指定
error_log = "/var/log/php_errors.log"
; エラーをログに記録
log_errors = On
; 全てのエラーを対象に表示する設定(開発環境向け)
error_reporting = E_ALL
上記の設定により、PHPは発生したエラーを指定したファイルに書き込みます。
設定内容が正しいか、設定後にログファイルにエラーが記録されるか確認してください。
設定反映のための注意点
php.iniの設定変更は、PHPの動作に直結します。
設定変更後は以下の点に注意してください。
- PHPの再起動が必要な場合があるため、Webサーバー(ApacheやNginx)のリロード・再起動を行ってください
- CLIとWebサーバーで異なるphp.iniが読み込まれている可能性があるため、用途に合わせた設定確認が必要です
- ログファイルのパスは、Webサーバーから書き込み可能なディレクトリに設定してください
display_errorsとerror_reportingの確認
設定内容の組み合わせの影響
開発環境においては、エラーの検出を容易にするために、display_errors
も利用されることが多いですが、本番環境ではセキュリティ上の理由から非表示とするのが一般的です。
display_errors
… ブラウザ画面にエラーメッセージを表示error_reporting
… 出力対象のエラーを細かく指定
例えば、開発環境では以下の設定を行い、エラーが画面とログの両方に表示されるようにすることが考えられます。
display_errors = On
error_reporting = E_ALL
log_errors = On
このように設定すると、すべてのエラーが確認でき、エラーの原因を迅速に探ることができます。
しかし、display_errors
が有効の場合、機密情報が表示されるリスクがあるため、本番環境では必ずOFFにしてください。
また、error_reporting
の設定値は数式としても表記可能です。
例えば、以下のように「すべてのエラーを表示し、通知だけを除外する」設定は
と表現され、エラーと警告の発生状況によりログへの出力結果が変わります。
ログファイルの配置とパーミッション
ログ出力先パスの確認
ファイルパス指定方法の確認
ログ出力先として指定するファイルパスは、PHPの設定値で直接指定されます。
相対パスと絶対パスが存在しますが、意図した場所にログが出力されるよう、以下の点を確認してください。
- 絶対パス(例:
/var/log/php_errors.log
)を利用すると予期しないディレクトリに出力されるリスクが低減されます - Windows環境ではドライブ文字(例:
C:\php\logs\php_errors.log
)を含むパスを指定する必要があります
また、PHPのエラー出力設定が反映されるか、実際にファイルが生成されるかを確認するために、簡単なサンプルコードを実行してみるとよいでしょう。
<?php
// エラーログ出力の動作確認用サンプルコード
error_log("PHP configuration check: This is a test error message.");
?>
// ログファイルに "PHP configuration check: This is a test error message." が追記される
ファイルパーミッションの確認
読み書き権限のチェック
ログファイルの出力には、Webサーバーからの読み書き権限が必要です。
パーミッションが不足していると、ログが出力されないため、以下の点を確認してください。
- ログファイルのパーミッションは、Webサーバーユーザーが書き込み可能なモード(例:
chmod 666
や適切なユーザーグループの設定)になっているか - ディレクトリ全体のパーミッションも合わせてチェックし、ファイルが作成可能な状態かを確認してください
シェルコマンドやFTPクライアントを利用して、ファイルの所有者と権限が正しく設定されているかを確認することを推奨します。
error_log関数の利用方法
関数の基本パラメーター確認
出力方法のパターン検証
PHPには、error_log()
関数を利用して任意のエラーメッセージをログに出力する手段が用意されています。
関数の基本的な使い方は、エラーメッセージを第1引数に渡すだけです。
以下はシンプルなサンプルコードです。
<?php
// シンプルなエラーメッセージをログファイルへ出力する
error_log("Function usage: This is a simple error message.");
?>
// 指定されたログファイルに "Function usage: This is a simple error message." が記録される
また、第2引数で出力先を指定することも可能です。
例えば、メール送信やシステムログへの出力を行う場合は、以下のように使用します。
<?php
// 第二引数に3を指定し、ログファイルを直接指定する例
$logFile = "/var/log/php_custom.log";
error_log("Custom log message", 3, $logFile);
?>
// /var/log/php_custom.log に "Custom log message" が追記される
上記のサンプルから、出力方法のパターン(デフォルト出力と第三引数での出力先指定)を確認してください。
出力文字列の取り扱い
文字エンコーディングと形式の確認
エラーログの出力内容は、文字エンコーディングや出力形式によって見やすさや解析の容易さが変わります。
以下の点に留意してください。
- PHPスクリプト内で使用する文字列は、UTF-8エンコーディングが推奨されます
- ログファイル自体のエンコーディングも、システム全体で統一しておくとトラブルが少なくなります
- エラーメッセージに日時やエラーコードなど情報を含めると、後から原因を特定しやすくなります
具体例として、タイムスタンプを含むエラーメッセージの生成方法は以下のようになります。
<?php
// タイムスタンプ付きエラーログメッセージのサンプル
$timestamp = date("Y-m-d H:i:s");
$message = "[$timestamp] Character encoding check: ログ出力のテストメッセージです。";
error_log($message);
?>
// ログファイルに "[2023-10-05 15:30:00] Character encoding check: ログ出力のテストメッセージです。" のように記録される
UTF-8で記述することで、マルチバイト文字が正常に表示され、後処理が容易になります。
Webサーバーとの連携確認
Apacheの設定確認
php設定との連動状況確認
ApacheとPHPの連携において、php.iniの設定が正しく反映されているか確認する必要があります。
主に以下の点をチェックします。
- Apacheの
httpd.conf
や.htaccess
ファイル内で、PHP設定の上書きが行われていないか - ApacheのモジュールとしてPHPが組み込まれる場合、モジュールの設定がphp.iniの設定と一致しているか
ApacheでのPHP設定確認のためには、以下のような.htaccessファイルを利用するケースもあります。
# PHPのエラーログ設定を上書きする例
php_value error_log "/var/log/php_errors.log"
php_value log_errors "On"
// Apacheの設定により、PHPが指定されたエラーログにエラーを書き込む状態となる
これにより、ApacheがPHPエラーの出力先として指定ファイルに書き込むことを確認できます。
Nginxの設定確認
サーバーログとの連携ポイント確認
NginxとPHP-FPMの連携環境では、PHPのログ機能とサーバーログの連携が重要です。
Nginx自体はPHPエラーを直接処理しないため、PHP-FPMの設定もあわせて確認してください。
主要な確認ポイントは以下のとおりです。
- PHP-FPMの設定ファイル(例:
www.conf
)で、エラーログが正しい出力先に設定されているか - Nginxの設定ファイルで、FastCGIパラメータが適切に指定され、エラーログとの連動が正常に機能しているか
例えば、PHP-FPMの設定ファイルの一部は以下のように記述されていることが多いです。
; PHP-FPMのエラーログ設定例
php_admin_value[error_log] = /var/log/php-fpm.log
php_admin_flag[log_errors] = on
// PHP-FPMが /var/log/php-fpm.log にエラーを記録する設定となっている
また、Nginx側ではFastCGIの設定が以下のようになっているか確認します。
fastcgi_param PHP_VALUE "error_log=/var/log/php_errors.log \n log_errors=on";
// Nginx経由でPHPにエラーログ設定が引き継がれる
このように、PHP-FPMとNginxの設定が連携することで、エラー発生時に適切なログが一元管理できるようになります。
まとめ
本記事では、PHPのerror_logが出力されない原因とその対策について、php.ini設定、ログファイルの配置・パーミッション、error_log関数の使い方、さらにはApacheやNginxとの連携設定まで解説しました。
各設定項目の確認とサンプルコードを通して、基本的なトラブルシュート方法を網羅的に把握する内容です。
ぜひこの記事を参考に、ご自身の環境設定の見直しや改善に取り組んでみてください。