Jak zapisywać logi z jednego serwisu do osobnego pliku?

Normalnie po prostu dostajesz logger Serwis, a logi trafiają do:

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

Chciałbym logować wiadomości z serwisów SOAP tylko do:

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

Nie do głównego pliku logu.

Czytałem książkę kucharską, ale nie rozumiem, jak skonfigurować monolog. Jakieś wskazówki?
Author: Trix, 2011-11-17

3 answers

MonologBundle rejestruje wszystko używając tych samych programów obsługi dla całego frameworka. Oznacza to, że jeśli jedna z Twoich usług musi logować się do różnych programów obsługi, powinieneś utworzyć własny Logger/Handler i wprowadzić go do usługi.

To może być przykładowy 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 wszystko wyjaśni.

Update: począwszy od symfony 2.1, możesz również skonfigurować, które kanały odbierają które programy obsługi, więc możesz alternatywnie zrobić coś takiego to:

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

Który tworzy nowy kanał soap( tzn. instancję loggera odbierającą wszystkie programy obsługi), następnie konfiguruje różne programy obsługi 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, że główna obsługa otrzyma wszystko oprócz kanału soap, a obsługa soap otrzyma tylko kanał soap. Możesz również usunąć klucz channels z głównego programu obsługi, jeśli chcesz, aby twój główny plik dziennika miał wszystko, ale także mieć kopię tylko dzienników soap osobno. To przynosi wiele elastyczność, a jak widzisz kanały to tablica, więc możesz wymienić kanały, które chcesz, lub użyć notacji czarnej listy !name, aby wykluczyć niektóre i dołączyć Wszystko inne.

 78
Author: Seldaek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-17 06:47:44

Miałem podobny problem i zdecydowałem się użyć biblioteki Monolog bezpośrednio zamiast usługi Monolog.

Monolog używa Monolog\Handler\StreamHandler do zapisu do plików. Strona github 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, aby nadal korzystać z usługi i po prostu wcisnąć nowy handler (i pop go po zakończeniu-w przeciwnym razie można niechcący napisać więcej niż chciałeś do własnego dziennika), ale nie testowałem tego. Szczerze mówiąc łatwiej było po prostu korzystać z biblioteki bezpośrednio.

 28
Author: Steven Mercatante,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-17 15:46:25

Rozwiązałem ten sam problem tworząc własne kanały w Konfiguracji .yml Jak wyjaśniono w tym linku Jak logować Wiadomości do różnych plików .

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ęp do mojego loogera za pomocą dynamicznie utworzonej usługi o nazwie monolog. logger. my_logger
 6
Author: Genoud Magloire,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-10 14:22:05