laravel 框架中抛出异常时为啥会自动写入一条 error 级别的日志?

问题描述

我们的业务接口中处理非正常流程时都会转为一个通用的异常给抛出去,然后在 Handler 中统一处理。但是近日发现每天会有很多的接口告警,排查后发现我们抛出异常时,Laravel 自动写入了一条「error」级别的错误日志,又因为业务告警程序是根据「error」级别的日志做的告警,才导致了这个问题。

接口文件

public function foo(): Response
{
    if(true){
        return new Response();
    }
    //如果出现其他情况,直接抛异常出去
    throw new BusinessException('验证码错误', 10025);
}

Handler 文件

public function render($request, Exception|\Throwable $e): Response
{
    parent::render($request, $e);
    //处理Business异常
    if ($e instanceof BusinessException) {
        return new Response($e->getCode(), $e->getMessage());
    }
}

业务环境

1). 当前使用的 Laravel 版本?

9.52.0

2). 当前使用的 php/php-fpm 版本?

PHP 版本:8.1
php-fpm 版本:8.1

我的疑问

  1. 为什么 laravel 在运行时遇到抛出的异常,就会自动给日志写入一条 error 级别的日志呢?
  2. 如何才能关闭这个功能?或者修改写入日志的错误级别?
代码是写给人看的,顺便给机器运行一下。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案

在 app/Exceptions/Handler.php 文件的 register() 方法中添加代码:

    public function register(): void{
        $this->reportable(function (Throwable $e) {
            //
        });
        // 下面两行是添加的代码
        $this->reportable(function(BusinessException $e){
        })->stop();
    }
5个月前 评论
讨论数量: 4

在 app/Exceptions/Handler.php 文件的 register() 方法中添加代码:

    public function register(): void{
        $this->reportable(function (Throwable $e) {
            //
        });
        // 下面两行是添加的代码
        $this->reportable(function(BusinessException $e){
        })->stop();
    }
5个月前 评论
sanders

我想你所需的答案都在手册这个章节:错误处理《Laravel 10 中文文档》

无论是更改日志级别还是关闭日志都有说明。

reportable 的闭包中返回 false 就会关闭日志

$levels 成员变量可设置不同异常类对应的日志级别

5个月前 评论
raison 5个月前

我猜你是想说自定义的异常类型不记录日志吧,这个文档确实有

file

5个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!