2012-07-02 9 views
11

私のSymfony2アプリで悪いことが起こったときに警告したい。今すぐログでERRORを探します。残念ながら、「HTTP 404 - ファイルが見つかりません」(NotFoundHttpException)は、「HTTP 403 - 禁止」(AccessDeniedHttpException)と同様にエラーとして記録されます。NotFoundHttpExceptionの重大度をどのように減らすのですか?

これはエラーを保証するものではありません。これらはせいぜい警告でなければなりません。これらのログをあまり重大でないレベルにするにはどうすればよいですか?

例エラー:

[2012-07-02 16:58:21] request.ERROR: Symfony\Component\HttpKernel\Exception\NotFoundHttpException: No route found for "GET /foo" (uncaught exception) at /home/user/Symfony2_v2.0.12/vendor/symfony/src/Symfony/Bundle/FrameworkBundle/EventListener/RouterListener.php line 83 [] [] 

答えて

8

私が働く何かを見つけました。ここで

<?php 

namespace Acme\DemoBundle\Listener; 

use Symfony\Component\EventDispatcher\EventDispatcher; 
use Symfony\Component\HttpKernel\Log\LoggerInterface; 
use Symfony\Component\EventDispatcher\Event; 
use Symfony\Component\HttpKernel\KernelEvents; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; 

class ExceptionLoggingListener { 
    private $logger; 

    public function __construct(LoggerInterface $logger) { 
    $this->logger = $logger; 
    } 

    public function onKernelException(GetResponseForExceptionEvent $event) { 
    if(!$event) { 
     $this->logger->err("Unknown kernel.exception in ".__CLASS__); 
     return; 
    } 
    $notFoundException = '\Symfony\Component\HttpKernel\Exception\NotFoundHttpException'; 

    $e = $event->getException(); 
    $type = get_class($e); 
    if ($e instanceof $notFoundException) { 
     $this->logger->info($e->getMessage()); 
     $response = new Response(Response::$statusTexts[404], 404); 
     $event->setResponse($response); 
     return; 
    } 

    $accessDeniedException = '\Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException'; 
    if ($e instanceof $accessDeniedException) { 
     $this->logger->info($e->getMessage()); 
     $response = new Response(Response::$statusTexts[403], 403); 
     $event->setResponse($response); 
     return; 
    } 
    $this->logger->err("kernel.exception of type $type. Message: '".$e->getMessage()."'\nFile: ".$e->getFile().", line ".$e->getLine()."\nTrace: ".$e->getTraceAsString()); 
    } 

} 
+2

ランダムサイドノートのhttp://symfony.com/doc/current/logging/monolog_regex_based_excludes.htmlを参照してください:あなたは代わりに '$タイプ'のinstaceof' ===「何とかを使用する必要があります'' http://php.net/manual/en/internals2.opcodes.instanceof.php – MDrollette

+0

よろしくお願いします。修正しました、ありがとう! –

+0

[Lachlan Peaseは書きました](http://article.gmane.org/gmane.comp.php.symfony。symfony2/9774 /): "代わりに、Symfony \ Component \ HttpKernel \ EventListener \ ExceptionListenerをサブクラス化し、NotFoundHttpExceptionsのwarn()だけにロジックを変更します。これは複数の例外リスナーを必要としないというメリットがあります)、しかし、すべてのレスポンスコードを独自のサブクラスに保存する必要があります。これはメンテナンスの悪夢です。 " (ありがとう、Lachlan、それはさらに良く聞こえます!) –

6

は少ないとの方法です:私は一緒に私が欲しいだけで何に見えるリスナーを石畳の応答がイベントに設定することができ、かつGetResponseForExceptionEvent docs

The propagation of this event is stopped as soon as a response is set.

言うSymfony2 internals doc on the kernel.exeption event言及コード:)

1. Symfonys ExceptionListnerクラスを拡張し、ロギング方法上書き:

2. [設定twig.exception_listener.classパラメータ:

parameters: 
    twig.exception_listener.class: "MyBundle\EventListener\ExceptionListener" 
+4

2.1バージョンの 'ExceptionListener'クラスに2.1のバージョンがないと、2.1バージョンを使っている人は誰もこのメソッドの実装に失敗することに気付く価値があります。 'logException'メソッド(https://github.com/symfony/symfony/blob/2.1/src/Symfony/Component/HttpKernel/EventListener/ExceptionListener.php) – akluth

0

ます。また、エラーレベルの活動戦略(これを使用して行われ除く実際にsymfonyのビルトイン404エラーを使用することができますので、私はこれを推測それを行う適切な方法です)。 config.yml

monolog: 
    handlers: 
     main: 
      type: fingers_crossed 
      handler: loggly 
      activation_strategy: 'mybundle.monolog.fingers_crossed.activation_strategy' 
     loggly: 
      type: loggly 
      token: %loggly_token% 
      level: error 
      tag: %loggly_tag% 

services.yml

services: 
    mybundle.monolog.fingers_crossed.activation_strategy: 
     class: MyBundle\Handler\FingersCrossed\ErrorLevelActivationStrategy 
     arguments: 
      - '@request_stack' 
      - 'error' 

ErrorLevelActivationStrategy.php

(そのアクションレベルがないconfig.ymlに、ここで設定されます)
<?php 
namespace MyBundle\Handler\FingersCrossed; 

use Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy as BaseErrorLevelActivationStrategy; 
use Symfony\Component\HttpKernel\Exception\HttpException; 
use Symfony\Component\HttpFoundation\RequestStack; 

/** 
* Activation strategy that ignores client errors (4xx) 
*/ 
class ErrorLevelActivationStrategy extends BaseErrorLevelActivationStrategy 
{ 
    protected $requestStack; 
    public function __construct(RequestStack $requestStack, $actionLevel) 
    { 
     parent::__construct($actionLevel); 
     $this->requestStack = $requestStack; 
    } 
    /** 
    * {@inheritdoc} 
    */ 
    public function isHandlerActivated(array $record) 
    { 
     $isActivated = parent::isHandlerActivated($record); 
     if (
      $isActivated 
      && isset($record['context']['exception']) 
      && $record['context']['exception'] instanceof HttpException 
      && $record['context']['exception']->getStatusCode() >= 400 
      && $record['context']['exception']->getStatusCode() <= 499 
      && ($request = $this->requestStack->getMasterRequest()) 
     ) { 
      $isActivated = false; 
     } 
     return $isActivated; 
    } 
} 

https://gist.github.com/sobstel/d791d0347ee1f4e47b6e

4

ちょうどあなたの構成にexcluded_404sを追加します。

monolog: 
    handlers: 
     main: 
      type:   fingers_crossed 
      action_level: error 
      handler:  nested 
      excluded_404s: 
       - ^/ 
     nested: 
      type: stream 
      path: "%kernel.logs_dir%/%kernel.environment%.log" 
      level: debug 

は参照

関連する問題