如何通过 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 有一个很好的例子说明如何 注入 服务中的当前用户。 (制作一个依赖 SecurityContext
或 TokenStorage
的 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%
我正在使用 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 有一个很好的例子说明如何 注入 服务中的当前用户。 (制作一个依赖 SecurityContext
或 TokenStorage
的 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%