【问题标题】:Log errors even more verbosely with Symfony2使用 Symfony2 更详细地记录错误
【发布时间】:2012-04-06 19:43:45
【问题描述】:

我的生产日志记录使用了以下配置:

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:从 会话 [] []

[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] 请求。错误: Symfony\Component\HttpKernel\Exception\NotFoundHttpException: ...未找到捆绑\实体\用户对象。 (未捕获的异常)在 /var/www/.../vendor/bundles/Sensio/Bundle/FrameworkExtraBundle/Request/ParamConverter/DoctrineParamConverter.php 第 50 行 [] []

[2012-03-21 21:24:09] security.DEBUG:将 SecurityContext 写入 会话 [] []

我真的很想在这里有一个堆栈跟踪,或者至少是我的控制器中触发错误的行号。否则真的是很多人猜测可能出了什么问题。

现在,问题是:有什么方法可以实现这样更详细的日志记录?

【问题讨论】:

    标签: php logging symfony


    【解决方案1】:

    是的,这是可以实现的。

    创建一个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"
    

    您可以根据需要对其进行调整。

    【讨论】:

      【解决方案2】:

      我喜欢Symfony docs 的解决方案。您所要做的就是将以下代码添加到您的 services.yml 文件中:

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

      这使用IntrospectionProcessor,一个经过测试的处理器,将更多信息添加到您的日志中。很可能把你关心的信息也拉出来了。

      【讨论】:

        猜你喜欢
        • 2016-01-09
        • 1970-01-01
        • 2015-03-18
        • 2011-05-25
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多