2012-03-22 13 views
19

ho usato la seguente configurazione per la mia registrazione di produzione:errori nel registro ancora più verbosely con Symfony2

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: [email protected] 
      to_email: [email protected] 
      subject: Error Occurred! 
      level:  debug 

questo invia messaggi di posta elettronica come questo:

[2012-03-21 21:24:09] security.DEBUG: Read SecurityContext from the session [] []

[2012-03-21 21:24:09] security.DEBUG: Reloading user from user provider. [] []

[2012-03-21 21:24:09] security.DEBUG: Username "jakob.asdf" was reloaded from user provider. [] [] [2012-03-21 21:24:09] request.INFO: Matched route "_user_settings" (parameters: "_controller": "...Bundle\Controller\UserController::settingsAction", "username": "Jakob.asdf", "_route": "_user_settings") [] []

[2012-03-21 21:24:09] request.ERROR: Symfony\Component\HttpKernel\Exception\NotFoundHttpException: ...Bundle\Entity\User object not found. (uncaught exception) at /var/www/.../vendor/bundles/Sensio/Bundle/FrameworkExtraBundle/Request/ParamConverter/DoctrineParamConverter.php line 50 [] []

[2012-03-21 21:24:09] security.DEBUG: Write SecurityContext in the session [] []

mi piacerebbe molto avere una traccia dello stack qui, o almeno il numero di riga nel mio controller che ha attivato l'errore. Altrimenti è davvero un sacco di supposizioni su cosa potrebbe essere andato storto.

Ora, la domanda: esiste un modo per ottenere un registro ancora più dettagliato?

risposta

23

Sì, può essere possibile.

Creare una classe 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); 
    } 
    } 
} 

E quindi registrare l'ascoltatore.

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" 

È possibile modificarlo come richiesto.

+0

fantastico - grazie! – stoefln

8

Mi piace la soluzione dal Symfony docs. Tutto quello che dovete fare è aggiungere il seguente codice al file services.yml:

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

Questo utilizza il IntrospectionProcessor, un processore testato per aggiungere più informazioni al registro. Estrae le informazioni che ti interessano troppo probabilmente.

Problemi correlati