web-dev-qa-db-ja.com

PHP CLIはエラーを記録しません

PHPは現在、コマンドラインから生成されたエラーをログに記録しません。

私が持っています :

log_errors = On
error_log = /var/log/php_errors.log

/etc/php5/cli/php.iniにあります

これを機能させるためのさらなる設定がありませんか?

39
bcmcfc

PHP CLIが/var/log/php_errors.logへの書き込みアクセス権を持っていることを確認してください。

さらに、次のように正しいphp.iniファイルを使用していることを確認できます。

php -a -c /etc/php5/cli/php.ini
40
George Cummins

この質問と回答のスレッドは、Ubuntu 12.04環境でPHP CLIロギングをセットアップする際に非常に役立ちました。そこで、私が学んだことを抽出する回答を投稿したいと思いました。 David ChanGeorge 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.logwww-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.dphp_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.
31
JakeGould

診断として、この方法でエラーログへの書き込みを強制的に試みることができます。

php -c /etc/php5/cli/php.ini -r " error_log('test 123'); "

ログにテスト123が表示されるはずです。

tail /var/log/php_errors.log
15
David Chan

PHPのロギング/レポートの動作は、error_reportingにも依存しています。

いくつかのPHPフレームワーク(たとえばCodeIgniter))は、プロダクションモードでerror_reporting(E_STRICT)ステートメントまたは同等のものを実行します。これにより、ログに記録されるエラーの数/種類が大幅に削減されます。

何かをデバッグする場合は、コードの直前に次のステートメントを置くだけです。

error_reporting(E_ALL);
3
Dangelov

なぜphp.iniのユーザー権限がないのか、またはおそらくないのかわからない場合、情報なしの解析エラーをデバッグする別の方法は、phpソースを別のphpソースで次のようなボディでラップすることです。

ini_set('display_errors',1);
error_reporting(E_ALL);

include "mybustedfile.php";
2
Charlie

in PHP file

error_log("You messed up!", 3, "/var/tmp/my-errors.log");

端末内

tail -f /var/tmp/my-errors.log

出力めちゃくちゃになった!