返回
Apache2 PHP 8.3中如何逐行输出error_log()?
php
2024-03-13 10:03:49
如何让 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 手册。
常见问题解答
-
为什么 error_log() 函数的输出组合成一行?
这是 PHP 8.3 中的新行为,旨在提高性能。
-
如何禁用 error_append_string?
将 error_append_string 设置为 no。
-
为什么我的自定义错误处理程序不起作用?
确保您已使用 set_error_handler() 注册了处理程序。
-
如何使用 APC 模块实现逐行输出?
在 php.ini 中添加以下行:
apc.error_handling = 1
-
如何从错误日志中排除特定错误?
使用 error_log() 函数的第三个参数来指定要过滤的错误类型。