通常你只會得到logger
服務,並記錄到:如何將來自一個服務的日誌寫入單獨的文件?
%kernel.root_dir%/%kernel.environment%.log
我想記錄的消息形成SOAP服務ONLY到:
%kernel.root_dir%/%kernel.environment%.soap.log
不是主要日誌文件。
我已閱讀食譜,但我不明白如何配置monolog。
任何幫助,線索?
通常你只會得到logger
服務,並記錄到:如何將來自一個服務的日誌寫入單獨的文件?
%kernel.root_dir%/%kernel.environment%.log
我想記錄的消息形成SOAP服務ONLY到:
%kernel.root_dir%/%kernel.environment%.soap.log
不是主要日誌文件。
我已閱讀食譜,但我不明白如何配置monolog。
任何幫助,線索?
MonologBundle使用相同的處理程序記錄整個框架的所有內容。這意味着如果您的某個服務需要登錄到不同的處理程序,您應該創建自己的記錄器/處理程序並將其注入到您的服務中。
這可能是一個例子配置(在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
鍵,但也可以分別僅備份肥皂日誌的副本。這帶來了很大的靈活性,正如你看到的頻道是一個數組,所以你可以列出你想要的頻道,或者使用黑名單表示排除一些幷包含其他所有內容。
我有類似的問題,我選擇直接使用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');
它可能仍然使用該服務,只需按一個新的處理程序(和彈出一次,你就大功告成了 - 否則,你可能會在不經意間寫的比你想更你的自定義日誌),但我沒有測試過。說實話,直接使用庫似乎更容易。
該軟件包不支持其他方式創建不同的日誌比基於在記錄的層面上。您的解決方案很好,但可能值得在DIC中註冊此記錄器及其處理程序,以便您可以將其注入模型的任何位置。 –
確實有可能只是推動處理程序並在執行完soap之後彈出它,但在這種情況下要小心,您推送的處理程序應該將'$ bubble = false'傳遞給它的構造函數,否則之前的處理程序仍然會被調用。你也可以先推動一個NullHandler來壓制一切,然後你自己的處理程序只捕捉你感興趣的級別。 – Seldaek
終於有一些理智,非常感謝你! –
我通過在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
我對答案很感興趣。幾周前我問了一個類似的問題:http://stackoverflow.com/questions/7714790/custom-monolog-logging-channel-in-symfony2-command – Reuven