从 mod php error_log 写入 Apache Errorlog 的日志行限制
P粉814160988
P粉814160988 2024-02-03 17:43:09
0
1
340

我有一个简单的 apache 2.4 + mod_php 设置作为 Web 服务器。 php.ini 中的 error_log 指令未设置,因此它采用默认值 0。该行为在此 (https://www.php.net/manual/en/function.error-log.php) 中进行了介绍,总结一下最终结果,我看到它被转发到 SAPI (mod_php) 模块的日志处理程序。日志被转发到 Apache 来处理,后者又根据我设置的 ErrorLog 指令记录在一个文件中。

现在的问题是,当 php 端的日志语句长度超过 8192 字节时,它们会被截断为正好 8192 字节的字符串,如 Apache 错误日志中所示。 8192 字节的限制有点令人费解,因此在将 strace 附加到工作线程并查看系统调用时,我发现它只执行一次写入调用,并以 8192 字节作为要写入的长度。我知道 php 有日志限制控制/指令,但它们对 error_log 语句没有任何影响,我也验证了这一点。只是补充一下,我当前的 php 日志长度限制是 1024(默认),但它仍然在 apache 错误日志中记录 8192 字节。

将此行为与使用参数 message_type 为 3 将 error_log 发送到文件进行比较,我可以看到完整的字符串以 8192 字节的块形式写入。 附上为此的 strace 日志:

fstat(64, {st_mode=S_IFREG|0777, st_size=25009583, ...}) = 0
lseek(64, 0, SEEK_CUR)                  = 0
lseek(64, 0, SEEK_CUR)                  = 0
write(64, "<text to be logged>"..., 8192) = 8192
write(64, "<continued text ...>"..., 8192) = 8192
write(64, "<continued text ...>"..., 8192) = 8192

如果 message_type 为 0,唯一的区别是只有一次写入调用。

有人可以对此提供一些解释以及如何绕过这个 8192 字节限制吗?

P粉814160988
P粉814160988

全部回复(1)
P粉567281015

正如已经提到的,请检查两次

log_errors_max_len should be 0.

https://www .php.net/manual/en/errorfunc.configuration.php#ini.log-errors-max-len

正如手册中提到的,这一切都是以字节为单位发生的,所以我们必须检查其他文件。 https://www.php.net/manual/ en/faq.using.php#faq.using.shorthandbytes

nginx/php-fpm也需要调整:

https://forums.freebsd.org/threads/howto-stop-nginx-php-fpm-from-truncating-your-stack-trace-error-message.56543/

在 /etc/php-fpm.conf 中,您可以更改 log_limit = NumberInBytes 的值,然后重新启动 php-fpm

为了避免或检查其他错误,您还可以 在 php.ini 中取消设置 error_log 指令 以便将其记录到 nginx 的标准错误 然后会登录到他自己的错误日志中。

设置也很有用 php-fpm 配置 php-fpm.conf 中的 catch_workers_output = yes 这样标准错误就不会被丢弃。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!