2012-04-04 14 views
7

Sto usando Symfony2 e monologo di scrivere nei registri specifici in un file di log definito (mylogfile.log):Symfony2/Monolog: Log Level - mostra solo app.INFO?

#config_dev.yml 
monolog: 
    handlers: 
     main: 
      type: stream 
      path: %kernel.logs_dir%/%kernel.environment%.log 
      level: debug 
     file: 
      type: stream 
      path: %kernel.logs_dir%/mylogfile.log 
      level: info 

Io sono l'accesso al file di log nel mio controller tramite:

$logger = $this->get('logger'); // Log 
    $logger->info('somelogcontent'); 

Ora il mio problema è che il mio file di registro contiene l'intero livello di informazioni, il che significa che mi dà tutti i registri app.INFO (che è quello che voglio) e request.INFO (che non ho davvero bisogno):

[2012-04-04 11:13:17] request.INFO: Matched route ... blablabla 
[2012-04-04 11:13:17] app.INFO: somelogcontent 
... 

Esiste un modo per non registrare il file Request.INFO?

Mike

risposta

9

Si deve fare un nuovo servizio logger, che dovrebbe essere utilizzato nelle vostre classi. In questo modo, config.yml:

services: 
    my_logger: 
    class: Monolog\Logger 
    arguments: [my_info] 
    calls: 
     - [pushHandler, [@my_log_handler]] 

    my_log_handler: 
    class: Monolog\Handler\StreamHandler 
    arguments: [%kernel.root_dir%/logs/my_info.log, 100] 

Uso (in Controller, per esempio):

$this->get('my_logger')->info('info message'); 

Informazioni più dettagliate in symfony cookbook.

+0

Che cosa succede se si desidera livellare il gestore "my_logger"? Immagina di impostare su tutti i tuoi controller un diverso livello di messaggi. Usando molti dei metodi info, alert, err. Come si dice la configurazione in un dato momento solo per scrivere nel registro quelli con avvertenza o rilevanza più elevata (avviso o errore) e non scrivendo le informazioni e le avvertenze? Qualche possibilità di farlo? – ElPiter

+3

Non sono sicuro di aver compreso correttamente la domanda, ma proverò a rispondere.Devi cambiare argomento nel gestore (ora è '100') in un altro numero (ad esempio, '200' per registrare meno). Controlla i valori reali in 'Monolog \ Monolog'. Facendo così i tuoi metodi di informazione/debug/errore di chiamata di codice come al solito, ma verrà registrato solo thoso con valore 200 e superiore. –

+1

Hai capito perfettamente la mia domanda e in realtà ho risolto il mio problema. Ad essere onesti, non sapevo a cosa servisse questo parametro. Una vergogna. Grazie mille – ElPiter

1

è possibile livello di avviso utente. di file: Tipo: flusso percorso:% kernel.logs_dir%/mylogfile.log livello: avviso

$logger = $this->get('logger'); // Log 
$logger->alert('somelogcontent'); 
1

Questo messaggio di registro proviene dal servizio router_listener. È possibile ridefinirlo nel file di configurazione dei servizi.

Quello che ho fatto nel mio principale pacchetto config/services.yml:

services: 

    # ... 

    router_listener: 
     class: %router_listener.class% 
     arguments: ['@router', %request_listener.http_port%, %request_listener.https_port%] 
     tags: 
      - { name: kernel.event_listener, event: kernel.request, method: onEarlyKernelRequest } 
      - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest } 

Rende "matched route ..." messaggi non essere registrato (come RouterListener non ha un logger di log servizio nei suoi argomenti del costruttore).

+0

Questo è davvero bello. Ho appena guardato il mio vecchio post mentre stavo ancora incontrando lo stesso problema. ;) Grazie molto! – Mike

6

Con la versione 2.4 e successive (attenzione, il ciclo di rilascio di MonologBundle non è più sincronizzato con symfony più) di MonologBundle, ora puoi definire nuovi canali molto semplici tramite la configurazione, senza definire i servizi.

monolog: 
    channels: ["my_channel"] 
    handlers: 
     file: 
      type: stream 
      path: %kernel.logs_dir%/mylogfile.log 
      level: info 
      channels: my_channel 

Ora è sufficiente ottenere il logger creata automaticamente per il nuovo canale nel controller:

$logger = $this->get('monolog.logger.my_channel'); 
$logger->info('somelogcontent'); 

so vecchia questione, ma questa nuova funzione dal MonologBundle~2.4 dovrebbe essere menzionato.

+1

monolog.logger.my_logger - dovrebbe essere monolog.logger.my_channel? – gingerCodeNinja

+0

Infatti, mi ha preso;) –