Apache不记录PHP错误日志。

24

PHP 通过 CLI 成功地将错误日志记录到 /var/log/php_errors.log。

但 Apache + PHP 却无法记录错误。

[bla@notebook ~]$ apachectl -v
Server version: Apache/2.2.17 (Unix)
Server built:   May 19 2011 03:15:39

[bla@notebook ~]$ php -v
PHP 5.3.6 with Suhosin-Patch (cli) (built: Mar 23 2011 13:28:00) 
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies

我在 php.ini 文件中有以下配置:

display_errors = On
error_reporting = E_ALL | E_STRICT
log_errors = On
error_log = php_errors.log

httpd.conf 文件中:

ErrorLog "/var/log/httpd/error_log"

权限:

[bla@notebook /]$ ls -la /var/log/httpd/
-rwxrwxr-x 1 root root 133351 21.11.2011 11:18 access_log*
-rwxrwxr-x 1 root http   1307 21.11.2011 11:18 error_log*

[bla@notebook /]$ ls -la /var/log/php_errors.log 
-rwxrwxr-x 1 root http 521 14.11.2011 17:31 /var/log/php_errors.log*

正如您所见,Apache 守护程序有权限写入日志文件。

/var/log/php_errors.log 和 /var/log/httpd/error_log 中仍然没有来自 Apache 或 PHP 的错误。

更新1。

在 php.ini 中更改了此行:

error_log = php_errors.log 

转换为完整路径:

error_log = /var/log/php_errors.log 

权限已经正常。但如果有人也遇到问题,你可以将日志文件的权限设置为0777或更改文件所有者来进行调试。


有关php.ini的任何事情?其中一些默认自动在CLI上工作,但在运行Web服务器时必须启用。 - PurplePilot
例如,哪些设置可能会丢失?找不到了。 - Justinas Lelys
在我的情况下,忘记在虚拟主机中配置:php_admin_value error_reporting 'E_ALL&〜E_STRICT' - pevik
7个回答

9
通常Apache和CLI有两个独立的php.ini文件-您确定正在查看正确的文件吗?
编辑:
我可以想到另外两个选项:
一些Apache指令会干扰PHP的日志路径(或禁用日志选项,但这种情况非常不可能)-尝试在php.ini中设置日志文件的绝对路径(@ Frosty Z建议类似于此)
我注意到您的PHP安装应用了Suhosin补丁,该补丁进行了几个限制性修改以提高安全性。虽然理论上一个用户在http用户组中具备足够的权限来写入日志文件-但可能存在一些类似于suphp的行为,当通过Web访问脚本时,它将以/作为其所有者设置的用户名执行(即脚本的文件所有者)-请尝试更改它。

在我的情况下,只有一个php.ini文件。我正在使用http://chakra-linux.org/about.html。 - Justinas Lelys

6
我遇到了同样的问题。
在php.ini中设置log_errors_max_len = 0对我有用。
参考PHP手册

设置error_log中log_errors的最大长度(以字节为单位)。该信息会添加源信息。默认值为1024,而将其设置为0则不施加任何最大长度限制。该长度适用于记录的错误、显示的错误以及$php_errormsg,但不适用于显式调用的函数,例如error_log()。


2

在过去的经验中,我发现有两种情况下没有错误日志:

  1. Apache运行的用户没有修改php_error_log文件的权限。
  2. 由于.htaccess配置不当(例如错误的重写模块设置),导致出现错误500。在这种情况下,错误会被记录到Apache的error_log文件中。

如何查找 Apache 正在以哪个用户身份运行 - pal4life

0

检查正确服务器上的日志路径对我有所帮助... 捂脸


0

检查您正在访问的PHP脚本以及Apache如何配置以访问它。

在某些配置中(例如虚拟主机、特定目录...),error_log文件可能设置为与默认文件名/路径不同的路径/名称。

然后建议您检查Apache配置文件。


我没有在虚拟主机配置中覆盖error_log路径:[bla httpd]# find . | xargs grep "ErrorLog" ./conf/extra/httpd-ssl.conf:ErrorLog "/var/log/httpd/error_log" ./conf/httpd.conf:# ErrorLog: The location of the error log file. ./conf/httpd.conf:# If you do not specify an ErrorLog directive within a <VirtualHost> ./conf/httpd.conf:ErrorLog "/var/log/httpd/error_log" - Justinas Lelys

0
这可能也是由于Apache自己的LogLevel指令造成的,如果设置过高,将覆盖PHP的日志记录。但它不会覆盖PHP在页面上输出错误的能力,即display_error,并且也不影响CLI PHP。如果您遇到了特定的症状,那么值得深入研究。

0

httpd.conf 不是 Apache 配置文件唯一的位置,

例如:

如果您使用安全连接 https://,则额外的配置将优先生效,您需要在类似于 /opt/local/apache2/conf/extra/httpd-ssl.conf 的文件中查找配置。

您可以在那里找到类似以下的内容:

ErrorLog "/var/log/apache/ssl_error.log"

在正常的日志文件中,您将看不到任何错误记录,但所有错误都将记录在ssl_error.log文件中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接