Configurare Monolog per mostrare messaggi di console

Si può usare la console per mostrare messaggi per determinati livelli di verbosità, usando l’istanza di Symfony\Component\Console\Output\OutputInterface che è stata passata durante l’esecuzione di un comando.

Vedi anche

In alternativa, si può usare il logger PSR-3 fornito con il componente console.

Quando ci sono molti log, non è facile mostrare informazioni a seconda delle impostazioni di vebosità (-v, -vv, -vvv), perché occorre inserire le chiamate all’interno di condizioni. Il codice diventa velocemente prolisso o sporco. Per esempio:

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

protected function execute(InputInterface $input, OutputInterface $output)
{
    if ($output->getVerbosity() >= OutputInterface::VERBOSITY_DEBUG) {
        $output->writeln('Un\'informazione');
    }

    if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
        $output->writeln('Un\'altra informazione');
    }
}

Invece di usare questi metodi semantici per verificare ogni livello di verbosità, MonologBridge fornisce ConsoleHandler, che ascolta gli eventi di console e scrive messaggi di errore nell’output della console a seconda del livello corrente di log e della verbosità della console.

L’esempio precedente può essere riscritto come:

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

protected function execute(InputInterface $input, OutputInterface $output)
{
    // ipotizzando che Command estenda ContainerAwareCommand...
    $logger = $this->getContainer()->get('logger');
    $logger->debug('Un\'informazione');

    $logger->notice('Un\'altra informazione');
}

A seconda del livello di verbosità con cui gira il comando e della configurazione dell’utente (vedere sotto), questi messaggi possono essere o non essere mostrati in console. Se sono mostrati, hanno data/ora e colore adeguato. Inoltre, i log di errore sono scritti nell’output di errore (php://stderr). Non c’è più bisogno di gestire in modo dinamico le impostazioni di verbosità.

Il gestore di console di Monolog è abilitato nella configurazione di Monolog. Questo è il predefinito anche in Symfony Standard Edition.

  • YAML
    # app/config/config.yml
    monolog:
        handlers:
            console:
                type: console
    
  • XML
    <!-- app/config/config.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:monolog="http://symfony.com/schema/dic/monolog">
    
        <monolog:config>
            <monolog:handler name="console" type="console" />
        </monolog:config>
    </container>
    
  • PHP
    // app/config/config.php
    $container->loadFromExtension('monolog', array(
        'handlers' => array(
            'console' => array(
               'type' => 'console',
            ),
        ),
    ));
    

Con l’opzione verbosity_levels si può adattare la mappatura tra verbosità e livello di log. Nell’esempio fornito mostrerà anche i notice in modalità verbosa normale (invece che solo i warning). Inoltre, usa solo messaggi di log con il canale personalizzato mio_canale e cambia lo stile di visualizzazione tramite un formattatore personalizzato (vedere il riferimento di MonologBundle per maggiori informazioni):

  • YAML
    # app/config/config.yml
    monolog:
        handlers:
            console:
                type:   console
                verbosity_levels:
                    VERBOSITY_NORMAL: NOTICE
                channels: mio_canale
                formatter: mio_formattatore
    
  • XML
    <!-- app/config/config.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:monolog="http://symfony.com/schema/dic/monolog">
    
        <monolog:config>
            <monolog:handler name="console" type="console" formatter="mio_formattatore">
                <monolog:verbosity-level verbosity-normal="NOTICE" />
                <monolog:channel>mio_canale</monolog:channel>
            </monolog:handler>
        </monolog:config>
    </container>
    
  • PHP
    // app/config/config.php
    $container->loadFromExtension('monolog', array(
        'handlers' => array(
            'console' => array(
                'type' => 'console',
                'verbosity_levels' => array(
                    'VERBOSITY_NORMAL' => 'NOTICE',
                ),
                'channels' => 'mio_canale',
                'formatter' => 'mio_formattatore',
            ),
        ),
    ));
    
  • YAML
    # app/config/services.yml
    services:
        mio_formattatore:
            class: Symfony\Bridge\Monolog\Formatter\ConsoleFormatter
            arguments:
                - "[%%datetime%%] %%start_tag%%%%message%%%%end_tag%% (%%level_name%%) %%context%% %%extra%%\n"
    
  • XML
    <!-- app/config/services.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
    
         <services>
            <service id="mio_formattatore" class="Symfony\Bridge\Monolog\Formatter\ConsoleFormatter">
                <argument>[%%datetime%%] %%start_tag%%%%message%%%%end_tag%% (%%level_name%%) %%context%% %%extra%%\n</argument>
            </service>
         </services>
    
    </container>
    
  • PHP
    // app/config/services.php
    $container
        ->register('mio_formattatore', 'Symfony\Bridge\Monolog\Formatter\ConsoleFormatter')
        ->addArgument('[%%datetime%%] %%start_tag%%%%message%%%%end_tag%% (%%level_name%%) %%context%% %%extra%%\n')
    ;
    

Argomento precedente

Configurare Monolog con errori per email

Argomento successivo

Configurare Monolog per escludere gli errori 404 dal log

Questa pagina