2011-11-17 57 views
53

通常你只會得到logger服務,並記錄到:如何將來自一個服務的日誌寫入單獨的文件?

%kernel.root_dir%/%kernel.environment%.log 

我想記錄的消息形成SOAP服務ONLY到:

%kernel.root_dir%/%kernel.environment%.soap.log 

不是主要日誌文件。

我已閱讀食譜,但我不明白如何配置monolog。

任何幫助,線索?

+0

我對答案很感興趣。幾周前我問了一個類似的問題:http://stackoverflow.com/questions/7714790/custom-monolog-logging-channel-in-symfony2-command – Reuven

回答

74

MonologBu​​ndle使用相同的處理程序記錄整個框架的所有內容。這意味着如果您的某個服務需要登錄到不同的處理程序,您應該創建自己的記錄器/處理程序並將其注入到您的服務中。

這可能是一個例子配置(在YAML):

services: 
    my_logger: 
     class: Symfony\Bridge\Monolog\Logger 
     arguments: [soap] 
     calls: 
      - [pushHandler, [@my_handler]] 

    my_handler: 
     class: Monolog\Handler\StreamHandler 
     # 200 = INFO, see Monolog::Logger for the values of log levels 
     arguments: [%kernel.root_dir%/%kernel.environment%.soap.log, 200] 

    soap_service: 
     class: Your\Soap\Client 
     arguments: [@my_logger] 

我希望這個澄清它。

更新:因爲symfony 2.1的,你也可以配置哪些渠道獲得其處理程序,所以你可以交替做這樣的事情:

services: 
    soap_service: 
     class: Your\Soap\Client 
     arguments: [@logger] 
     tags: 
      - { name: monolog.logger, channel: soap } 

這將創建一個新的肥皂信道(即記錄器實例接收所有的處理程序),然後爲這個通道配置不同的處理程序:

monolog: 
    handlers: 
     main: 
      type: stream 
      path: %kernel.root_dir%/%kernel.environment%.log 
      level: error 
      channels: [!soap] 
     soap: 
      type: stream 
      path: %kernel.root_dir%/%kernel.environment%.soap.log 
      level: info 
      channels: [soap] 

這意味着主處理器將接收的一切,但肥皂通道,肥皂處理程序將只接收這樣ap頻道。如果您希望主日誌文件包含所有內容,也可以刪除主處理程序上的channels鍵,但也可以分別僅備份肥皂日誌的副本。這帶來了很大的靈活性,正如你看到的頻道是一個數組,所以你可以列出你想要的頻道,或者使用黑名單表示排除一些幷包含其他所有內容。

+0

非常好的解決方案 –

+0

非常好的解決方案! – AlterPHP

+2

渠道不好屁股 –

27

我有類似的問題,我選擇直接使用Monolog庫而不是Monolog服務。

Monolog使用Monolog\Handler\StreamHandler寫入文件。該github page有一個簡單的例子:

use Monolog\Logger; 
use Monolog\Handler\StreamHandler; 

// create a log channel 
$log = new Logger('name'); 
$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING)); 

// add records to the log 
$log->addWarning('Foo'); 
$log->addError('Bar'); 

它可能仍然使用該服務,只需按一個新的處理程序(和彈出一次,你就大功告成了 - 否則,你可能會在不經意間寫的比你想更你的自定義日誌),但我沒有測試過。說實話,直接使用庫似乎更容易。

+2

該軟件包不支持其他方式創建不同的日誌比基於在記錄的層面上。您的解決方案很好,但可能值得在DIC中註冊此記錄器及其處理程序,以便您可以將其注入模型的任何位置。 –

+1

確實有可能只是推動處理程序並在執行完soap之後彈出它,但在這種情況下要小心,您推送的處理程序應該將'$ bubble = false'傳遞給它的構造函數,否則之前的處理程序仍然會被調用。你也可以先推動一個NullHandler來壓制一切,然後你自己的處理程序只捕捉你感興趣的級別。 – Seldaek

+7

終於有一些理智,非常感謝你! –

5

我通過在config.yml中創建自定義通道來解決同樣的問題,如鏈接How to Log Messages to different Files中所述。

monolog: 
    channels: ['my_logger'] 

    handlers: 
     my_logger: 
      level: debug 
      type:  stream 
      path:  '%kernel.logs_dir%/my_logger.log' 
      channels: [my_logger] 

在此之後,我可以訪問我的looger具有動態創建的服務命名爲monolog.logger。my_logger

相關問題