我的应用程序中有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) [] []
我的应用程序中没有任何关键。我怎样才能摆脱这个重要的信息?
答案 0 :(得分:0)
这是由于monolog日志级别。支持的当前日志级别为:
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,依此类推