2012-03-22 6 views
19

로 내 생산 로깅을 위해 다음과 같은 구성을 사용했다로그인 오류 더욱 자세하게 Symfony2

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

정말 스택 추적을 가지고 싶어요 여기, 또는 적어도 내 컨트롤러에서 오류를 유발 한 행 번호. 그렇지 않으면 실제로 잘못 될 수 있었던 것을 실제로 추측합니다.

이제 질문 : 그러한 자세한 로깅을 수행 할 수있는 방법이 있습니까?

답변

23

예 가능합니다.

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" 

귀하의 요구 사항으로 조정할 수 있습니다.

+0

위대한 - 감사합니다! – stoefln

8

나는 Symfony docs에서 해결책을 좋아한다. 당신이 할 일은 당신의 services.yml 파일에 다음 코드를 추가한다 :

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

이 로그에 더 많은 정보를 추가 할 IntrospectionProcessor, 테스트 된 프로세서를 사용합니다. 당신이 너무 걱정하는 정보를 뽑아냅니다.