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


Silex, exceptions caught by error handler, still leave CRITICAL log message

我有URL/init流吗?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) [] []

我的应用程序中没有任何关键内容。我该如何摆脱这条关键信息?

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

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

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

文档

DEBUG将记录所有内容,INFO将记录除DEBUG以外的所有内容,NOTICE将记录除调试和INFO之外的所有内容等等。

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

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