2012-03-22 11 views
19

he utilizado la siguiente configuración para mi registros de producción:errores de registro aún más informa extensamente 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 

Esto envía mensajes de correo electrónico de esta manera:

[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 [] []

realmente me gustaría tener un seguimiento de la pila aquí, o al menos el número de línea en mi controlador que desencadenó el error. De lo contrario, es realmente una gran cantidad de adivinar lo que podría haber ido mal.

Ahora, la pregunta: ¿hay alguna forma de lograr un registro aún más detallado?

Respuesta

23

Sí, puede ser posible.

Cree una clase 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); 
    } 
    } 
} 

Y a continuación, registre el oyente.

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" 

Puede ajustarlo como su requisito.

+0

genial - gracias! – stoefln

8

Me gusta la solución del Symfony docs. Todo lo que tiene que hacer es añadir el siguiente código a su archivo services.yml:

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

Este utiliza el IntrospectionProcessor, un procesador probado para añadir más información para su registro. Extrae la información que te interesa demasiado probablemente.

Cuestiones relacionadas