我正在使用 php 的“error_log()”向 apache 错误日志发送一些相当长的堆栈跟踪,并且条目被截断。我还没有找到使条目更长的方法。有任何想法吗?
5 回答
通过 error_log() 的错误消息的最大长度的默认限制是 1024 字节。
详细信息有http://www.php.net/manual/en/errorfunc.configuration.php#ini.log-errors-max-len
正如 Leopoldo所说,在这种情况下设置log_errors_max_len
似乎毫无用处,PHP 手册清楚地说明了这一点。
到目前为止,我能找到的唯一解决方案是使用:
error_log("Long error message...", 3, CUSTOM_LOG_FILE);
的第二个参数error_log()
允许您将消息重定向到自定义文件。因此,最后一个参数应该是自定义日志文件的路径。
这样我就会收到完整的错误消息,而且对某人来说可能更重要的是,非 ASCII 字符在那里清晰可读(虽然不确定,可能是我的错,但是当我用标准日志文件记录它们时 - 我得到了之类的东西\xd0\xbf
)。
PHP 手册介绍了log_errors_max_len
php.ini中的设置:
以字节为单位设置 log_errors 的最大长度。(...) 默认值为 1024,0 允许根本不应用任何最大长度。
有些人建议您可以更改它,例如:
ini_set("log_errors_max_len", 2048);
但手册补充说:
此长度应用于记录的错误、显示的错误以及 $php_errormsg,但不适用于显式调用的函数,例如 error_log()。
我正在努力寻找解决方案。如果我这样做会编辑。
阅读上面的问题让我想知道问题是否在 Apache 内部。是的,在 PHP for Apache 中发生的截断甚至允许超过 10,000 个字符。这是一个评估 Apache 将长错误消息发布到其日志中的能力的 Perl 脚本:
#!/usr/bin/perl -w
#
# Test error log length limitations
# Result: no limitation
#
#
use strict;
use CGI;
my $query = CGI->new;
print $query->header;
print "<html><body>You have reached "
."cgi-bin/admin/test_error_log.pl"
."</body></html>\n";
print STDERR "This is an error message from $0\n";
print STDERR "
[Above should be a blank line] here is a multiline error message
here is the third and final line of it\n";
print STDERR 'abcde' x 200; #1,000 characters
print STDERR "\nAbove is 1,000 characters of output of 'abcde'\n";
print STDERR 'vwxyz' x 2000; #10,000 characters
print STDERR "\nAbove is 10,000 characters of output of 'vwxyz'\n";
ErrorLog "|bin/rotatelogs /var/logs/errorlog.%Y-%m-%d-%H_%M_%S 5M"
此配置将在错误日志文件大小达到 5 兆字节时轮换它,并且日志文件名称的后缀将以 errorlog.YYYY-mm-dd-HH_MM_SS 形式创建。
有关更多信息,请阅读 apache.org Link Here的官方文档