【问题标题】:Silex, exceptions caught by error handler, still leave CRITICAL log messageSilex,错误处理程序捕获的异常,仍然留下 CRITICAL 日志消息
【发布时间】:2015-12-24 08:49:55
【问题描述】:

我的应用中有 URL /init-stream?id=...,它被一些外部应用程序使用。它应该回答 OK 或一些错误代码。如果没有 id 参数,则响应应为 ERROR_NO_ID。所以,我的代码是

$app->get('/init-stream', function(Request $request) use ($app) {
    $idParam = $request->get('id');
    if ($idParam === NULL) {
        return new Response('ERROR_NO_ID', 400);
    }
    ...
});

一切正常,但我想将此情况记录为警告,因为它可以帮助我调试调用此请求的应用程序。所以,我把代码改成:

$app->get('/init-stream', function(Request $request) use ($app) {
    $idParam = $request->get('id');
    if ($idParam === NULL) {
        throw new App\Exception\BadRequestException('ERROR_NO_ID', 400);
    }
    ...
});

$app->error(function(App\Exception\BadRequestException $e) use ($app) {
    $app['logger']->addWarning(...);
    return new Response($e->getMessage(), $e->getCode);
});

一切正常,但有一件事我不喜欢。我的日志看起来像:

[2015-12-22 16:20:00] myapp.CRITICAL: App\Exception\BadRequestException: ERROR_NO_ID (uncaught exception) at C:\Users\yy\onetimelink\public\index.php line 166 {"exception":"[object] (App\\Exception\\BadRequestException(code: 400): ERROR_NO_ID at C:\\Users\\yy\\onetimelink\\public\\index.php:166)"} []
[2015-12-22 16:20:00] myapp.WARNING: GET /init-stream?sex=male&age=33 : ERROR_NO_ID (C:\Users\yy\onetimelink\public\index.php:166) [] []

我的应用程序中没有任何重要内容。我怎样才能摆脱这个 CRITICAL 消息?

【问题讨论】:

    标签: php exception silex error-logging


    【解决方案1】:

    这是由于独白日志级别。当前支持的日志级别是:

    1. DEBUG (100):详细的调试信息。
    2. INFO (200):有趣的事件。示例:用户登录、SQL 日志。
    3. 注意 (250):正常但重要的事件。
    4. 警告 (300):不是错误的异常事件。示例:使用已弃用的 API、API 使用不当、不受欢迎 不一定是错误的事情。
    5. 错误 (400):不需要立即采取措施但通常应记录和监控的运行时错误。
    6. CRITICAL (500):严重情况。示例:应用程序组件不可用,意外异常。
    7. 警报 (550):必须立即采取行动。示例:整个网站关闭,数据库不可用等。这应该触发 SMS 提醒并唤醒您。
    8. EMERGENCY (600):紧急情况:系统无法使用。

    Documentation

    DEBUG 将记录所有内容,INFO 将记录除 DEBUG 之外的所有内容,NOTICE 将记录除 DEBUG 和 INFO 之外的所有内容,依此类推。

    因此,为了避免 CRITICAL 日志消息,日志级别应设置为 ALERT 或 EMERGENCY。

    Monolog 将异常分类为 CRITICAL 日志级别,并在发生异常并且您将日志级别设置为包含 CRITICAL 日志消息时将其添加到您的日志文件中。 我建议使用 DEBUG 级别进行开发,并从 ERROR 级别向下进行生产。还要在生产环境中设置 $app['debug']=false。

    【讨论】:

    • 这并不能真正回答问题(我也有)。如果我向 $app->error() 添加了一个处理程序并返回了正确的响应,为什么 monolog 会调用我的异常“意外”?我如何控制 monolog 为我做的这些我从未要求过的自动日志记录(也记录请求和响应)
    【解决方案2】:

    简答:错误回调的优先级低。您必须使用 >= -4 的优先级。例如:

    $app->error(function(App\Exception\BadRequestException $e) use ($app) {
         $app['logger']->addWarning(...);
         return new Response($e->getMessage(), $e->getCode);}, -4); // <= !!!this
    

    信息: KernelEvents::EXCEPTION 早于您的错误回调。这会触发类 Silex\EventListener\LogListener::onKernelException,等等

    【讨论】:

      猜你喜欢
      • 2012-02-08
      • 2013-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多