2011-10-10 14 views
15

W tym numerze cookbook article widzimy, jak używać niestandardowego kanału w usłudze. Ale w jaki sposób mogę użyć niestandardowego kanału logowania w poleceniu?niestandardowy kanał logowania monologu w komendzie symfony2

Utworzono polecenie symfony2, aby wykonać pewne czynności. Chciałbym użyć monologu do rejestrowania rzeczy wykonanych przez moją komendę.

Właściwie chcę napisać dziennik dla mojego polecenia w innym pliku niż logi aplikacji.

+0

Chcę wiedzieć, jak to zrobić: – HappyDeveloper

+2

Odpowiedzi na http://stackoverflow.com/questions/8169114/how-to-write-logs-from-one-service-into-separate-file/8210892#8210892 – Seldaek

+0

dzięki, odpowiedziałem na moje pytanie z tym łączem. – Reuven

Odpowiedz

0

W większości przypadków polecenie rozszerza ContainerAwareCommand (jak widać tutaj: http://symfony.com/doc/current/cookbook/console.html#creating-a-basic-command).

Oznacza to, że twoje polecenie ma dostęp do kontenera usługowego Symfony - który jest wielkim workiem wszystkich usług wewnątrz Symfony (tj. Użytecznych obiektów). W twoim przypadku trzeba usługę logger, które można uzyskać, chwytając go z pojemnika:

$logger = $this->getContainer()->get('logger'); 

(referencyjny: http://symfony.com/doc/current/cookbook/console.html#getting-services-from-the-service-container)

Teraz można korzystać z rejestratora jako normalne. Jeśli kiedykolwiek potrzebujesz innych usług, po prostu sprawdź komendę php app/console container:debug, która zawiera listę wszystkich usług w kontenerze.

Powodzenia!

+1

Dziękuję za odpowiedź. Wiem, jak korzystać z rejestratora. Chciałbym wiedzieć, w jaki sposób mogę użyć kanału niestandardowego dla tego programu rejestrującego. Chciałbym zapisać wyniki mojego polecenia w innym pliku. – Reuven

+0

dobre pytanie. Ktoś zna odpowiedź? –

6

Wszelkie polecenia niestandardowego, który rozciąga ContainerAwareCommand, ma dostęp do kontenera serwisowego symfony. Możesz zdefiniować usługę logującą się do niestandardowego kanału w konfiguracji.

<services> 
    <service id="console.logger" parent="monolog.logger_prototype"> 
     <argument index="0">mychannel</argument> 
    </service> 
</services> 

można uzyskać dostępu do usługi z polecenia w następujący sposób

$logger = $this->getContainer()->get('console.logger'); 

Ten rejestrator będzie rejestrował z kanałem jako „mychannel”.

FYI Domyślna usługa rejestratora loguje się do kanału "aplikacja". Można to zobaczyć w pliku Symfony/Bundle/MonologBundle/Resources/config/monolog.xml. Jest to również miejsce, gdzie zdefiniowana jest domyślna usługa logger.

<services> 
    <service id="monolog.logger" parent="monolog.logger_prototype" public="false"> 
     <argument index="0">app</argument> 
    </service> 

    <service id="logger" alias="monolog.logger" /> 

    <service id="monolog.logger_prototype" class="%monolog.logger.class%" abstract="true"> 
     <argument /><!-- Channel --> 
    </service> 
</services> 
4

Spróbuj użyć biblioteki bezpośrednio

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

// ... 

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

//add the erros to log file 

try { 
    //do something 
} catch(Exception $e) { 
    $log->addError($e->getMessage()); 
} 

Może ten można rozwiązać problemu, należy dodać to do pliku poleceń.

0

Dla Symfony 3.3 ze względu na usługi autowire gdy chcesz zalogować się na oddzielne pliki zastosowanie tego podejścia:

Na przykład załóżmy, musimy zalogować się na 2 obracających plików:

  • exception.log: Dla wyjątki spowodowane przez aplikację.
  • dataFetch.log: W przypadku połączeń z api pobiera dane aplikacji.

Kontrole na services.yml put:

monolog: 
    channels: ['dataFetch', 'exception'] 

    handlers: 

    dataFetch: 
    type: 'rotating_file' 
    level: info 
    type: stream 
    path: 'dataFetch.log' 
    max_files: 7 
    channels: dataFetch 

    exception: 
     type: 'rotating_file' 
     level: error 
     type: stream 
     path: 'exception.log' 
     max_files: 7 
     channels: exception 

Teraz dla Loger wyjątków można wstrzykiwać reklamę zależność monolog.logger.exception natomiast dla dataFetch można zależnościach wstrzyknąć monolog.logger.dataFetch.

Powiązane problemy