如何通过 monolog,symfony2 将用户名传递给 rollbar

how to pass username to rollbar via monolog, symfony2

我正在使用 rollbar.com 收集有关 symfony2 应用程序异常的所有详细信息。但是我不明白如何配置 monolog 以便它将用户名和用户 ID 传递给 rollbar。

我看到我可以通过 rollbar config as shown here,我想 person_fn 是我需要的。我仍然不知道把这个函数放在哪里(这应该是可用的,因为我需要检查安全令牌)以及如何将它传递给 rollbar。

# config_prod.yml
rollbar:
    type: rollbar
    level: error
    token: %rollbar_token%
    config:
        person_fn: getUserForRollbarRightAboutNowOrSomething

您的问题分为两部分:

滚动条

person_fn 正是您所需要的。您应该能够使用字符串添加对函数的引用(例如:"MyClass::static_function_reference""my_function_name")。

Symfony

免责声明:我不使用或不太了解 Symfony。

This question 有一些很好的例子说明如何在 Symfony 中获取当前用户。 (妙语:在控制器中你可以调用 $this.getUser()

This question 有一个很好的例子说明如何 注入 服务中的当前用户。 (制作一个依赖 SecurityContextTokenStorage 的 Twig 扩展,使用这些依赖项来获取用户对象)。

最后,还有经典的 PHP 动作:一旦您有用户,就将其添加到 $_REQUEST。我不确定 Symfony 是否支持这个,但它在非框架 PHP 应用程序中是一种有效的方式。

找到解决方案:

  • 将 monolog/monolog 包更新到至少 1.17.0 版本。
  • 创建 ContextProcessor 并更新用户信息

    #src/AppBundle/Monolog/RollbarContextProcessor
    
    namespace AppBundle\Monolog;
    
    use AppBundle\Entity\User;
    use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
    
    class RollbarContextProcessor
    {
        private $tokenStorage;
    
        public function __construct(TokenStorageInterface $tokenStorage)
        {
            $this->tokenStorage = $tokenStorage;
        }
    
        public function processRecord($record)
        {
            if ($this->tokenStorage->getToken()) {
                $user = $this->tokenStorage->getToken()->getUser();
    
                if ($user instanceof User) {
                    $record['context']['payload']['person'] = [
                        'id' => $user->getId(),
                        'username' => $user->getUsername(),
                        'email' => $user->getEmail(),
                    ];
                }
            }
    
            return $record;
        }
    }
    
  • 使用 monolog.processor 标记将 ContextProcessor 配置为服务。

    # app/config/config_prod.yml
    services:
        monolog.processor.rollbar_context:
            class: AppBundle\Monolog\RollbarContextProcessor
            arguments:  [@security.token_storage]
            tags:
                - { name: monolog.processor, method: processRecord, handler: rollbar }
    monolog:
        handlers:
            rollbar:
                type: rollbar
                level: error
                token: %rollbar_token%