2011-11-17 11 views
53

Normalnie po prostu dostać logger usługę, a kłody pod adresem:Jak pisać logi z jednej usługi do osobnego pliku?

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

Chciałbym komunikaty dziennika tworzyć usługi SOAP TYLKO do:

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

nie do głównego pliku dziennika.

Czytałem książkę kucharską, ale nie rozumiem, jak skonfigurować monolog.

Każda pomoc, wskazówki?

+0

Jestem bardzo zainteresowany odpowiedzią. Kilka tygodni temu zadałem podobne pytanie: http://stackoverflow.com/questions/7714790/custom-monolog-logging-channel-in-symfony2-command – Reuven

Odpowiedz

74

MonologBundle rejestruje wszystko przy użyciu tych samych procedur obsługi dla całego środowiska. Oznacza to, że jeśli jedna z Twoich usług wymaga zalogowania się do różnych programów obsługi, powinieneś stworzyć swój własny Logger/Handler i wprowadzić go do swojej usługi.

ten mógłby być przykładem config (w 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] 

Mam nadzieję, że to wyjaśnia to.

Aktualizacja: jak Symfony 2.1, można również określić, które kanały odbierać które teleskopowe, więc można ewentualnie zrobić coś takiego:

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

który tworzy nowy kanał mydła (tj rejestrator instancja odbierający Wszystkie ładowarki), a następnie skonfigurować różne ładowarki dla tego kanału:

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] 

oznacza to główny obsługi otrzyma wszystko oprócz kanału mydło, mydło i opiekun otrzyma tylko tak kanał ap. Możesz również usunąć klucz channels na głównej procedurze obsługi, jeśli chcesz, aby główny plik dziennika miał wszystko, ale miał też kopię tylko dzienników mydła oddzielnie. Zapewnia to dużą elastyczność, a jak widzisz, kanały są tablicą, dzięki czemu możesz wyświetlić listę kanałów, które chcesz, lub użyć czarnej listy, aby wykluczyć niektóre i zawrzeć wszystko inne.

+0

Bardzo ładne rozwiązanie –

+0

Bardzo dobre rozwiązanie! – AlterPHP

+2

Kanały są złe w dupie –

27

Miałem podobny problem i wybrałem opcję korzystania z biblioteki Monolog bezpośrednio zamiast usługi Monolog.

Monolog używa Monolog\Handler\StreamHandler do pisania do plików. github page ma prosty przykład:

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'); 

może być możliwe nadal korzystać z usługi i po prostu wcisnąć nowy obsługi (i pop raz skończysz - w przeciwnym razie może przypadkowo napisać więcej niż chciałeś się twój własny log), ale tego nie przetestowałem. Szczerze mówiąc, łatwiej było po prostu użyć biblioteki bezpośrednio.

+2

Pakiet nie obsługuje innych sposobów tworzenia różnych dzienników niż bazowanie na poziomie logowania. Twoje rozwiązanie jest dobre, ale prawdopodobnie warto zarejestrować ten rejestrator i jego program obsługi w DIC, aby można go było wprowadzić wszędzie, gdzie jest on w twoim modelu. –

+1

Rzeczywiście byłoby możliwe po prostu popchnięcie handler'a i wyskakiwanie go po wykonaniu mydła, ale w takim przypadku należy zachować ostrożność, program obsługi, który wypychasz powinien mieć '$ bubble = false' przekazany do konstruktora, w przeciwnym razie poprzednie procedury obsługi nadal będzie wywoływana. Możesz także najpierw nacisnąć NullHandler, aby stłumić wszystko, a następnie swój własny handler, aby złapać tylko te poziomy, które cię interesują. – Seldaek

+7

wreszcie coś zdrowego, dziękuję bardzo! –

5

Rozwiązałem ten sam problem, tworząc niestandardowe kanały w config.yml, jak wyjaśniono w tym linku 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] 

Po tym, mogę uzyskać dostępu do looger z dynamicznie utworzony usługę o nazwie monolog.logger.my_logger