PHPは現在、コマンドラインから生成されたエラーをログに記録しません。
私が持っています :
log_errors = On
error_log = /var/log/php_errors.log
/etc/php5/cli/php.iniにあります
これを機能させるためのさらなる設定がありませんか?
PHP CLIが/var/log/php_errors.log
への書き込みアクセス権を持っていることを確認してください。
さらに、次のように正しいphp.iniファイルを使用していることを確認できます。
php -a -c /etc/php5/cli/php.ini
この質問と回答のスレッドは、Ubuntu 12.04環境でPHP CLIロギングをセットアップする際に非常に役立ちました。そこで、私が学んだことを抽出する回答を投稿したいと思いました。 David Chan
と George Cummins
が提供する素晴らしい情報に加えて、logrotate.d
スクリプトを作成して、PHP CLIエラーログは、複数のユーザーが共通のPHP CLIエラーログにエラーを記録できるように設定するだけでなく、制御不能になりません。
まず、PHP CLIのデフォルトの動作は、標準出力にエラーメッセージを記録することです。ファイルへのロギングはデフォルトの動作ではありません。これは通常、PHP CLIコマンドを実行しているのと同じコマンドラインターミナルセッションにログインすることを意味します。 PHP iniファイルには、指定されたerror_log
に対応する機能がありますが、実際に機能させるには、さらに対応する必要があります。
最初に、最初のphp_errors.log
ファイルを作成する必要がありました。
Sudo touch /var/log/php_errors.log
問題のサーバーはさまざまなプロジェクトに取り組んでいるWeb開発者によって使用されているため、www-users
と呼ばれる共通のグループをセットアップしました。この場合、php_errors.log
がwww-users
によって読み取りおよび書き込み可能になるようにします。ファイルの所有権を次のように変更します。
Sudo chown root:www-users /var/log/php_errors.log
そして、ファイルのパーミッションをこれに変更します:
Sudo chmod 664 /var/log/php_errors.log
はい。セキュリティの観点から、www-users
の誰でも読み取りおよび書き込み可能なログファイルを持つことは、それほど素晴らしいことではありません。しかし、これは管理された共有作業環境です。だから、私はユーザーがこのようなことを尊重すると信じています。さらに、PHPがCLIから実行された場合、それを実行できるユーザーは、ログを書き込むためにも、ログへの書き込みアクセスが必要になります。
次に、/etc/php5/cli/php.ini
に進み、デフォルトのUbuntu 12.04設定を調整して、この新しいログファイルに一致させます。
Sudo nano /etc/php5/cli/php.ini
幸いなことにlog_errors
はUbuntu 12.04でデフォルトで有効になっています:
log_errors = On
ただし、ファイルへのロギングを許可するには、error_log
を次のように新しいファイルに一致するように変更する必要があります。
error_log = /var/log/php_errors.log
logrotate.d
スクリプトをセットアップします。これでうまくいくはずですが、ログを制御不能にしたくないので、logrotate.d
にphp_errors.log
を設定しました。 php-cli
内の/etc/logrotate.d/
というファイルを次のように作成します。
Sudo nano /etc/logrotate.d/php-cli
そして、このログ回転デーモンスクリプトの内容をそこに配置します。
/var/log/php_errors.log {
weekly
missingok
rotate 13
compress
delaycompress
copytruncate
notifempty
create 664 root www-users
sharedscripts
}
それが終わったら、上記の David Chan
のヒントを使用してセットアップをテストしましょう。
php -r "error_log('This is an error test that we hope works.');"
正しく実行された場合、PHP CLIエラーが標準出力に送信されなくなったため、空のコマンドプロンプトに戻るだけです。次のようなテストエラーメッセージの実際のphp_errors.log
を確認します。
tail -n 10 /var/log/php_errors.log
そして、次のようなタイムスタンプ付きのエラー行があるはずです。
[23-Jul-2014 16:04:56 UTC] This is an error test that we hope works.
診断として、この方法でエラーログへの書き込みを強制的に試みることができます。
php -c /etc/php5/cli/php.ini -r " error_log('test 123'); "
ログにテスト123が表示されるはずです。
tail /var/log/php_errors.log
PHPのロギング/レポートの動作は、error_reportingにも依存しています。
いくつかのPHPフレームワーク(たとえばCodeIgniter))は、プロダクションモードでerror_reporting(E_STRICT)
ステートメントまたは同等のものを実行します。これにより、ログに記録されるエラーの数/種類が大幅に削減されます。
何かをデバッグする場合は、コードの直前に次のステートメントを置くだけです。
error_reporting(E_ALL);
なぜphp.iniのユーザー権限がないのか、またはおそらくないのかわからない場合、情報なしの解析エラーをデバッグする別の方法は、phpソースを別のphpソースで次のようなボディでラップすることです。
ini_set('display_errors',1);
error_reporting(E_ALL);
include "mybustedfile.php";
in PHP file
error_log("You messed up!", 3, "/var/tmp/my-errors.log");
端末内
tail -f /var/tmp/my-errors.log
出力めちゃくちゃになった!