2

我目前正在開發一個Symfony 2應用程序,我想在我的模型中調用某些設置器時記錄日誌。在Symfony中注入記錄器2 ODM文檔

依我之見,有沒有辦法通過在Symfony的2靜態註冊表注入默認或訪問記錄器,所以我的方法如下:

我加了一個靜態方法和屬性的基礎我的模型的類,並在那裏設置記錄器。 我還添加了一個吸氣劑,然後在我的模型中可用。

我通過請求內核事件在那裏設置記錄器,所以記錄器僅在此事件發生後纔可用。

這個解決方案的工作原理,但對我來說似乎相當黑。任何人有更好的主意如何解決這個問題?不依賴於請求內核事件的設置方法會很好。不依賴靜態屬性的方法會更好!

注意!將記錄器添加到基本文檔可能會導致序列化問題。

回答

-1

您可以使用Monolog(official documentation)記錄活動。將記錄器作爲服務註冊,並且該服務將在服務容器中可用。

在app/config.yml中,在services下,註冊記錄器服務及其處理程序。註冊處理程序時,根據參數指定日誌文件。在下面的例子中,根據環境的不同,文件名將是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] 

一旦registerd記錄器服務,它可以在控制器被稱爲如下圖所示

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

對不起,但這並沒有解決我的問題。我已經有一個配置的記錄器,問題是如何將記錄器注入到我的數據庫域類中,這是不可注射但是新的。 AFAIK我無法從我的域類訪問服務容器。 –

+0

唯一的解決方案是以某種方式將loger定義爲Service。只有服務獲得注射 –

0

我只是把它作爲第二個參數的setter:

假設你有一個實體,所以解決方案ti如下:

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

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

N ote:而不是LoggerService取而代之您可能已經開發的記錄器類,並調用適當的方法LoggerService是我作出的一個假設,以顯示方式。

如果您使用的獨白,而不是一些定製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的setters。