在Symfony 2 ODM文档中注入Logger

时间:2014-04-07 09:35:30

标签: symfony logging dependency-injection doctrine-odm symfony-2.7

我目前正在开发一个Symfony 2应用程序,我想在我的模型中调用一些setter时记录。

正如我所见,默认情况下无法注入记录器或通过Symfony 2中的静态注册表访问它,所以我的方法如下:

我在模型的基类中添加了静态方法和属性,并在那里设置了Logger。 我还添加了一个吸气剂,然后可以在我的模型中使用。

我通过请求内核事件在那里设置记录器,因此记录器仅在此事件之后可用。

这个解决方案有效,但对我来说似乎相当讨厌。谁有更好的想法如何处理这个?不依赖于请求内核事件的设置方法会很好。一个不依赖静态属性的方法会更好!

注意!将记录器添加到基础文档可能会导致序列化问题。

2 个答案:

答案 0 :(得分:0)

我只是把它作为第二个参数给了setter:

假设您有一个实体,所以解决方案如下:

//Namespace Declaration above
class SomeEntity 
{
 ....
 private $somefield;

 public function setSomefield($somefield,LoggerService $l)
 {
    $this->somefield=$someField;
    $l->log(""Somefield Has Been Set"");  
 }
}

注意:而不是LoggerService用你可能已经开发的记录器类替换它并调用适当的方法LoggerService是我做出的假设,以便显示方式。

如果您使用的是Monolog而不是某些自定义LoggingClass:

//Namespace Declaration above
use Symfony\Bridge\Monolog\Logger;

class SomeEntity 
{
 ....
 private $somefield;

 public function setSomefield($somefield,Logger $l)
 {
    $this->somefield=$someField;
    $l->info("Somefield Has Been Set");  
 }
}

我希望它符合您的需求。这将有助于您更好地在没有序列化的probs的情况下记录setter。

答案 1 :(得分:-1)

您可以使用Monolog(official documentation)记录活动。将记录器作为服务注册,该服务将在服务容器中可用。

在app / config.yml中,在services下,注册logger服务及其处理程序。注册处理程序时,请根据参数指定日志文件。在下面给出的示例中,文件名将是dev.api.log或prod.api.log,具体取决于环境。

bt.api.logger:
  class: Symfony\Bridge\Monolog\Logger
  arguments: [app]
  calls:
    - [pushHandler, [@bt.api.logger_handler]]

bt.api.logger_handler:
  class: Monolog\Handler\StreamHandler       
  arguments: [%kernel.logs_dir%/%kernel.environment%.api.log, 200]

注册记录器服务后,可以在控制器中调用它,如下所示

$logger = $this->get('bt.api.logger');
$msg = "The setter was called";
$logger->info(msg);