С помощью Symfony2 регистрируйте ошибки еще более подробно - PullRequest
20 голосов
/ 22 марта 2012

Я использовал следующую конфигурацию для ведения журнала производства:

monolog:
    handlers:
        mail:
            type:         fingers_crossed
            action_level: error
            handler:      grouped
        grouped:
            type:    group
            members: [streamed, buffered]
        streamed:
            type:  stream
            path:  %kernel.logs_dir%/%kernel.environment%.log
            level: debug
        # buffered is used to accumulate errors and send them as batch to the email address
        buffered: 
            type:    buffer
            handler: swift
        swift:
            type:       swift_mailer
            from_email: info@....com
            to_email:   info@....com
            subject:    Error Occurred!
            level:      debug

Это отправляет электронные письма, как это:

[2012-03-21 21:24:09] security.DEBUG: прочитайте SecurityContext из сеанс [] []

[2012-03-21 21:24:09] security.DEBUG: перезагрузка пользователя от пользователя поставщик. [] []

[2012-03-21 21:24:09] security.DEBUG: Имя пользователя "jakob.asdf" было перезагружен от пользователя провайдера. [] [] [2012-03-21 21:24:09] request.INFO: Соответствующий маршрут "_user_settings" (параметры: "_controller": "... Bundle \ Controller \ UserController :: settingsAction", "имя пользователя": "Jakob.asdf", "_route": "_user_settings") [] []

[2012-03-21 21:24:09] request.ERROR: Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException: ... Bundle \ Entity \ User объект не найден. (необученное исключение) в /var/www/.../vendor/bundles/Sensio/Bundle/FrameworkExtraBundle/Request/ParamConverter/DoctrineParamConverter.php строка 50 [] []

[2012-03-21 21:24:09] security.DEBUG: Написать SecurityContext в сеанс [] []

Мне бы очень хотелось иметь здесь трассировку стека или хотя бы номер строки в моем контроллере, который вызвал ошибку. В противном случае очень много гаданий о том, что могло пойти не так.

Теперь вопрос: есть ли способ добиться еще более подробного ведения журнала?

Ответы [ 2 ]

24 голосов
/ 28 марта 2012

Да, это может быть достигнуто.

Создать ExceptionListener класс.

//namespace declarations

class ExceptionListener{
  /**
   * @var \Symfony\Component\HttpKernel\Log\LoggerInterface
   */
  private $logger =null;

  /**
   * @param null|\Symfony\Component\HttpKernel\Log\LoggerInterface $logger
   */
  public function __construct(LoggerInterface $logger = null)
  {
    $this->logger = $logger;
  }

  /**
   * @param \Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent $event
   */
  public function onKernelException(GetResponseForExceptionEvent $event)
  {
    if($this->logger === null)
      return;
    $exception = $event->getException();
    $flattenException = FlattenException::create($exception);
    $this->logger->err('Stack trace');
    foreach ($flattenException->getTrace() as $trace) {
      $traceMessage = sprintf('  at %s line %s', $trace['file'], $trace['line']);
      $this->logger->err($traceMessage);
    }  
  }
}

А затем зарегистрировать слушателя.

 kernel.listener.your_listener_name:
  class: FQCN\Of\ExceptionListener
  tags:
      - { name: kernel.event_listener, event: kernel.exception, method: onKernelException , priority: -1}
      - { name: monolog.logger, channel: mychannel }
  arguments: 
      - "@logger"

Вы можете настроить его как ваше требование.

8 голосов
/ 06 сентября 2012

Мне нравится решение из Symfony docs .Все, что вам нужно сделать, это добавить следующий код в ваш файл services.yml:

services:
    my_service:
        class: Monolog\Processor\IntrospectionProcessor
        tags:
            - { name: monolog.processor }

При этом используется проверенный процессор IntrospectionProcessor для добавления дополнительной информации в ваш журнал.Скорее всего, он извлекает информацию, которая вас волнует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...