Silex, исключения, перехваченные обработчиком ошибок, по-прежнему оставляют сообщение журнала CRITICAL.

У меня есть 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) [] []

В моем приложении нет ничего критичного. Как я могу избавиться от этого КРИТИЧЕСКОГО сообщения?

0

Решение

Это связано с уровнем журнала монологов. Поддерживаются текущие уровни журнала:

  1. DEBUG (100): подробная информация об отладке.
  2. ИНФОРМАЦИЯ (200): Интересные события. Примеры: пользователь входит в систему, журнал SQL.
  3. ВНИМАНИЕ (250): Нормальные, но значимые события.
  4. ПРЕДУПРЕЖДЕНИЕ (300): Исключительные случаи, которые не являются ошибками. Примеры: использование устаревших API, плохое использование API, нежелательно
    вещи, которые не обязательно неправильны.
  5. ОШИБКА (400): Ошибки времени выполнения, которые не требуют немедленных действий, но обычно должны регистрироваться и отслеживаться.
  6. КРИТИЧЕСКИЙ (500): Критические условия. Пример: компонент приложения недоступен, неожиданное исключение.
  7. ТРЕВОГА (550): Действие должно быть предпринято немедленно. Пример: весь сайт отключен, база данных недоступна и т. Д. Это должно вызвать SMS
    оповещения и разбудить вас.
  8. АВАРИЙНАЯ СИТУАЦИЯ (600): Аварийная ситуация: система не работает.

Документация

DEBUG будет регистрировать все, INFO будет регистрировать все, кроме DEBUG, NOTICE будет регистрировать все, кроме DEBUG и INFO и так далее в цепочке.

Поэтому, чтобы избежать КРИТИЧЕСКИХ сообщений журнала, уровень журнала должен быть установлен на АВАРИЙНЫЙ или АВАРИЙНЫЙ.

Monolog классифицирует исключение в соответствии с уровнем журнала CRITICAL и добавляет его в файл журнала всякий раз, когда возникает исключение, и у вас установлен уровень журнала для включения сообщений журнала CRITICAL.
Я рекомендую использовать уровень DEBUG для разработки и от уровня ERROR вниз для производства. Также установите $ app [‘debug’] = false на производстве.

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 и т. Д.

0

По вопросам рекламы [email protected]