使用自定义异常处理程序 (set_exception_handler) 时,不会自动记录异常


Exception is not logged automatically when custom exception handler (set_exception_handler) is used

我想使用自定义异常处理程序(使用 set_exception_handler() 函数设置)来控制发生未经处理的异常时打印给用户的内容。

不幸的是,在这种情况下,异常不会记录到 php 错误日志中,我不想编写自己的日志记录代码,因为自动异常日志记录对我来说绝对没问题。

问题是:
如果执行了自定义异常处理程序,有没有办法使 PHP 日志异常(默认情况下)?如果没有,有没有办法登录主php错误日志文件?

如果执行了自定义异常处理程序,有没有办法使 PHP 日志异常(默认情况下)?

不,不是来自 PHP 提供的内容(例如,在回调中返回FALSE)。

如果没有,有没有办法登录主php错误日志文件?

是的,您可以使用error_log文档功能来实现此目的。Exception文档应包含消息以及代码、文件名和行号。

它也是可字符串的error_log()添加了分隔换行符,因此它直接用于日志记录(它甚至会根据配置的大小缩小log_errors_max_len):

set_exception_handler(function ($throwable) {
    error_log((string)$throwable);
});

或者不那么冗长:

set_exception_handler('error_log');

演示/游乐场:https://3v4l.org/s41Vn

<小时 />

另一个或多或少的肮脏技巧是创建一个始终保留在内存中的异常捕获对象。如果它捕获了未捕获的异常,它将处理并存储它。如果发生破坏(在过程结束时),它可以重新扔掉它。然后 PHP 需要处理它并可能记录它。 但是,我认为这是实验性的,也可能是短视的,因为只能有一个异常处理程序,并且它会捕获未捕获的异常处理程序,因此没有太多方法可以继续(也许是更多的关闭功能材料)。