PHP错误日志和换行符

16

PHP配置设置中允许或阻止调试输出中的换行符转义是什么?

在两个不同的安装环境中(一个运行MAMP / OSX的开发笔记本电脑和一个运行Debian的开发服务器),调试时错误日志的结果不同。

error_log(print_r(array(1,2,4),1));

在Debian中,这个错误信息出现在/var/log/apache2/error.log文件中

[Thu Jul 30 11:32:34 2009] [error] [client 118.93.246.104] Array\n(\n    [0] => 1\n    [1] => 2\n    [2] => 4\n)\n, referer: http://dev.example.org/

在OSX上,此错误显示在/Applications/MAMP/logs/php_error_log位置。

[30-Jul-2009 11:34:00] Array
(
    [0] => 1
    [1] => 2
    [2] => 4
)

除了将日志文件重定位到 /Applications 目录之外,我更喜欢 MAMP 的调试方式。

谢谢!

2个回答

15

Chris,您应该能够在Debian上更改php.ini中的error_log指令以将其指向一个文件。如果未定义,则会经过syslog,但它不支持多行。

详细信息:

error_log函数

error_log指令


还应该提到,如果Apache运行的用户由于权限问题无法写入指定的error_log文件,则它也会被发送到syslog或Apache日志。 - Pistos

2

当Apache进程无法写入error_log文件时,会导致问题,因此syslog会代替写入该文件。这样会破坏换行符。

因此只需执行以下操作:

chmod 777 error.log

这应该能解决你的问题。

3
当心在攻击者可以写入的文件上设置go+x权限。请将组读/写和组所有权分配给Web服务器用户。注意日志轮换时权限更改被取消(logrotate配置中的chmod设置等)。 - Chris Burgess
同意这种方法有一定的不安全性(尽管我希望你的日志文件不会通过 Web 服务器访问...),但它是一个很好的快速本地开发环境,并且它指出了关键问题,即日志文件的权限可能会阻止 Apache 向其写入内容,导致使用 syslog。 - Jon z
1
我的解决方案更像是Chris Burgess的建议,我将我的用户添加到Web服务器运行的组中,更改了文件的权限以允许组完全访问,并将文件的所有权更改为Web服务器运行的用户/组,例如在预安装Apache的OSX上:sudo chown _www:_www /var/log/apache2/error_log; sudo chmod 770 /var/log/apache2/error_log; - Jon z
无法使其工作:运行Ubuntu 16.04,Apache2作为www-data(用户和组),vhost配置为ErrorLog ${APACHE_LOG_DIR}/myapp.error.log/var/www/apache2为755,并且myapp.error.logwww-data用户(和组)拥有。在该文件上的权限测试设置为777。 Apache已重新启动。仍然在该文件中转储\n。我错过了什么,有任何想法吗? - robbash

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