Silex,由错误处理程序捕获的异常,仍然留下CRITICAL日志消息

时间:2015-12-24 08:49:55

标签: php exception silex error-logging

我的应用程序中有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);
    }
    ...
});

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

$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) [] []

我的应用程序中没有任何关键。我怎样才能摆脱这个重要的信息?

2 个答案:

答案 0 :(得分:0)

这是由于monolog日志级别。支持的当前日志级别为:

  1. DEBUG(100):详细的调试信息。
  2. INFO(200):有趣的事件。示例:用户登录,SQL日志。
  3. 注意(250):正常但重要的事件。
  4. 警告(300):非错误发生的例外情况。示例:使用不推荐使用的API,API的使用不当,不合需要 不一定错的东西。
  5. 错误(400):运行时错误,不需要立即执行,但通常应记录和监视。
  6. 关键(500):危急情况。示例:应用程序组件不可用,意外异常。
  7. ALERT(550):必须立即采取措施。示例:整个网站关闭,数据库不可用等。这应该触发SMS 警报并叫醒你。
  8. 紧急情况(600):紧急情况:系统无法使用。
  9. Documentation

    DEBUG将记录所有内容,INFO将记录除DEBUG之外的所有内容,NOTICE将记录除DEBUG和INFO之外的其他内容以及链等。

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

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

答案 1 :(得分:0)

简短回答:错误回调的优先级是低。您必须使用优先级> = -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,依此类推