使用print_r时,error_log消息被截断

15

我对PHP不太熟悉,现在正在使用:

error_log("big array:" . print_r($bigArray, true));

查看一个大数组的内容,但是输出似乎在我到达输出中有趣的部分之前就被截断了,如下所示:

...
           [4] => Array
            (
                [id] => 100039235
                [start] => 11:00
                [end] => 19:00
                [punches] => Array
                    (
                        [0] => Array
                            (
                                [id] => 6319
                                [comment] => 

这是预期的吗?还有其他方法或解决办法可以将数组的更多内容记录下来吗?


2
你能提供一个例子吗?你确定它不是被error_log()限制了吗? - scrowler
可能是日志记录器的限制。为什么不在有趣的地方打印数组呢? - Anthony
5个回答

23
如果你检查PHP中的错误INI选项,你会注意到有一个log_errors_max_len选项:

设置log_errors的最大长度(以字节为单位)。在error_log中添加了关于源的信息。默认值为1024,0允许完全不应用任何最大长度。这个长度适用于记录的错误、显示的错误和$php_errormsg

当使用整数时,该值以字节为单位测量。如本FAQ所述,也可以使用简写表示法。

因此,如果你想使用error_log输出这些巨大的消息,请确保将log_errors_max_len更改为一个大数字(或0表示无限长度)。
// Append to the start of your script
ini_set('log_errors_max_len', '0');

听起来很合理!我在这里发布了另一个关于log_errors_max_len无效的问题:https://dev59.com/H4Pba4cB1Zd3GeqPmga5 也许你今天可以帮我两次 :) - Cotten
5
我想这个答案曾经是准确的。但现在,正如文档中所述并在Mike的答案中指出的那样,log_errors_max_len不再改变通过error_log()函数创建的条目限制。 - faintsignal

21

这个答案有点过时。

error_log的输出仍然会被截断,即使将log_errors_max_len设置为0(表示无限制)。

根据PHP文档中关于log_errors_max_len的说明

此长度适用于记录的错误、显示的错误以及$php_errormsg,但不适用于显式调用的函数,如error_log()

唯一让你的error_log()语句真正输出大量信息的方法是指定自定义日志文件。

error_log("big array:" . print_r($bigArray, true), 3, '/path/to/custom.log');
第二个参数(3)表示消息类型(外部日志),根据the error_log documentation的说明。

这个完美地运作了,一定是正确的答案。 - Máxima Alekz

2
正文:
如scrowler提到的那样,它的error_log限制了输出。
默认情况下,error_log将记录到syslog中,并且在您的代码中,其长度受运行时设置log_errors_max_len的限制,默认为1024。
有关这些函数和设置的进一步详细信息,请参见以下内容。

http://php.net/manual/en/function.error-log.php http://php.net/manual/en/errorfunc.configuration.php#ini.log-errors-max-len

您可能想要做的就是直接调用print_r($bigArray)以使其直接输出,或者如果您想在浏览器中看到更漂亮的东西,可以使用。
echo '<pre>' . print_r ($bigArray, TRUE) . '</pre>';

仍然被截断 - James

1

0
你可以通过多次调用error_log来击败系统,因为字符限制似乎只适用于单个调用:
function multiline_error_log($val) {
  $lines = preg_split("/[\r]?[\n]/", print_r($val, 1));
  foreach ($lines as $line) error_log($line);
}

只要print_r的输出中没有单个文本行超过字符限制,这将起作用。请注意,如果您担心空字符问题,将Jake的答案纳入如何定义multiline_error_log可能是值得的。

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