返回

Apache2 PHP 8.3中如何逐行输出error_log()?

php

如何让 Apache2 PHP 8.3 错误日志逐行输出

背景

PHP 8.3 中,Apache2 的新模块对 error_log() 函数的行为做出了更改,现在所有错误日志输出都组合成一行后再写入日志文件,这给调试输出带来不便。

问题

如何配置 PHP 模块,以便立即将每行错误输出到日志文件?还能去掉 AH01071: Got error 'PHP message ....' 消息。

解决方案

1. 编辑 php.ini

编辑 php.ini 文件(通常位于 /etc/php/8.3/apache2/php.ini),添加以下行:

error_log = /var/log/php-error.log
log_errors = On
display_errors = Off
error_append_string = yes
  • 将 /var/log/php-error.log 替换为您希望错误日志写入的位置。
  • error_append_string = yes 确保每行错误立即追加到日志文件。

2. 创建自定义错误处理程序

创建 error_handler.php 文件,并添加以下代码:

function custom_error_handler($errno, $errstr, $errfile, $errline)
{
    $error_message = sprintf("%s:%s: %s", basename($errfile), $errline, $errstr);
    error_log($error_message);
}

set_error_handler('custom_error_handler');

这将注册一个自定义错误处理程序,格式化错误消息并立即将它们写入日志文件。

结果

完成这些步骤后,error_log() 函数的输出将恢复到每个调用一行,并且不再显示 AH01071: Got error 'PHP message ....' 消息。

额外提示

  • 可以使用 APC 模块实现类似效果,但无需自定义错误处理程序。
  • 有关 Apache2 和 PHP 8.3 错误日志的更多信息,请参阅 Apache HTTP Server 文档和 PHP 手册。

常见问题解答

  1. 为什么 error_log() 函数的输出组合成一行?

    这是 PHP 8.3 中的新行为,旨在提高性能。

  2. 如何禁用 error_append_string?

    将 error_append_string 设置为 no。

  3. 为什么我的自定义错误处理程序不起作用?

    确保您已使用 set_error_handler() 注册了处理程序。

  4. 如何使用 APC 模块实现逐行输出?

    在 php.ini 中添加以下行:

    apc.error_handling = 1
    
  5. 如何从错误日志中排除特定错误?

    使用 error_log() 函数的第三个参数来指定要过滤的错误类型。