PHP CLI不会记录错误

bcm*_*cfc 39 php error-logging command-line-interface

PHP目前不会记录命令行产生的错误.

我有 :

log_errors = On
error_log = /var/log/php_errors.log
Run Code Online (Sandbox Code Playgroud)

在/etc/php5/cli/php.ini中

我错过了进一步的设置让这个工作吗?

Geo*_*ins 40

请检查运行PHP CLI的用户帐户是否具有写访问权限/var/log/php_errors.log.

此外,您可以验证您使用正确的php.ini文件,如下所示:

php -a -c /etc/php5/cli/php.ini
Run Code Online (Sandbox Code Playgroud)

  • 我不确定你的意思是"什么都没发生",但你可以通过使用phpinfo()并搜索"加载的配置文件"来确定你正在使用的配置文件 (2认同)

Jak*_*uld 31

在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
Run Code Online (Sandbox Code Playgroud)

由于有问题的服务器是由处理各种项目的Web开发人员使用的,因此我为他们设置了一个公共组www-users.在这种情况下,我希望php_errors.log通过www-users更改文件的所有权来实现可读写:

sudo chown root:www-users /var/log/php_errors.log
Run Code Online (Sandbox Code Playgroud)

然后将文件的权限更改为:

sudo chmod 664 /var/log/php_errors.log
Run Code Online (Sandbox Code Playgroud)

是的,从安全的角度来看,任何人都可以读写日志文件www-users并不是那么好.但这是一个受控制的共享工作环境.所以我相信用户尊重这样的事情.此外,当从CLI运行PHP时,任何能够做到这一点的用户都需要对日志进行写访问才能获得日志.

接下来,进入/etc/php5/cli/php.ini调整默认的Ubuntu 12.04设置以匹配此新日志文件:

sudo nano /etc/php5/cli/php.ini
Run Code Online (Sandbox Code Playgroud)

log_errors在Ubuntu 12.04中默认启用了Happily :

log_errors = On
Run Code Online (Sandbox Code Playgroud)

但是要允许记录到文件,我们需要更改error_log以匹配新文件,如下所示:

error_log = /var/log/php_errors.log
Run Code Online (Sandbox Code Playgroud)

设置logrotate.d脚本.

现在,应该是它,但因为我不想日志失控,我设置logrotate.dphp_errors.log.创建一个名为的文件php-cli,/etc/logrotate.d/如下所示:

sudo nano /etc/logrotate.d/php-cli
Run Code Online (Sandbox Code Playgroud)

并将此日志旋转守护程序脚本的内容放在其中:

/var/log/php_errors.log {
        weekly
        missingok
        rotate 13
        compress
        delaycompress
        copytruncate
        notifempty
        create 664 root www-users
        sharedscripts
}
Run Code Online (Sandbox Code Playgroud)

测试设置.

完成后,让我们使用David Chan上面的提示测试设置:

php -r "error_log('This is an error test that we hope works.');"
Run Code Online (Sandbox Code Playgroud)

如果运行正常,您应该只是退回到空命令提示符,因为PHP CLI错误不再发送到标准输出.因此请检查实际php_errors.log的测试错误消息,如下所示:

tail -n 10 /var/log/php_errors.log
Run Code Online (Sandbox Code Playgroud)

并且应该有一个带时间戳的错误行,看起来像这样:

[23-Jul-2014 16:04:56 UTC] This is an error test that we hope works.
Run Code Online (Sandbox Code Playgroud)

  • 这个答案结合了正在发生的事情的上下文,建议特定的配置更改以及如何制作它们,巩固日志记录和日志轮换并测试配置.其中一些受其他评论的启发,但这完全包含在一个地方.谢谢@JakeGould. (2认同)

Dav*_*han 15

作为诊断,您可以尝试以这种方式强制写入错误日志.

php -c /etc/php5/cli/php.ini -r " error_log('test 123'); "
Run Code Online (Sandbox Code Playgroud)

您现在应该在日志中看到测试123

tail /var/log/php_errors.log
Run Code Online (Sandbox Code Playgroud)


Dan*_*lov 5

PHP 的日志/报告行为也依赖于 error_reporting。

某些 PHP 框架(例如CodeIgniter)在生产模式下执行error_reporting(E_STRICT)语句或等效语句,这将严重减少记录的错误的数量/类型。

如果你想调试某些东西,那么你可以将以下语句放在代码之前:

error_reporting(E_ALL);
Run Code Online (Sandbox Code Playgroud)