У меня есть URL / init-stream? Id = … в моем приложении, оно используется некоторыми внешними приложениями. Он должен ответить ОК или какой-нибудь код ошибки. Если параметр 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) [] []
В моем приложении нет ничего критичного. Как я могу избавиться от этого КРИТИЧЕСКОГО сообщения?
Это связано с уровнем журнала монологов. Поддерживаются текущие уровни журнала:
DEBUG будет регистрировать все, INFO будет регистрировать все, кроме DEBUG, NOTICE будет регистрировать все, кроме DEBUG и INFO и так далее в цепочке.
Поэтому, чтобы избежать КРИТИЧЕСКИХ сообщений журнала, уровень журнала должен быть установлен на АВАРИЙНЫЙ или АВАРИЙНЫЙ.
Monolog классифицирует исключение в соответствии с уровнем журнала CRITICAL и добавляет его в файл журнала всякий раз, когда возникает исключение, и у вас установлен уровень журнала для включения сообщений журнала CRITICAL.
Я рекомендую использовать уровень DEBUG для разработки и от уровня ERROR вниз для производства. Также установите $ app [‘debug’] = false на производстве.
Короткий ответ: приоритет ошибочного обратного вызова — низкий. Вы должны использовать приоритет> = -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 и т. Д.