Documentação do Symfony - versão 3.1
Renderizada do repositório symfony-docs-pt-BR no Github

Como Configurar o Monolog para Exibir Mensagens de Console

É possível usar o console para imprimir mensagens para determinados níveis de verbosidade usando a instância OutputInterface que é passada quando um comando é executado.

See also

Alternativamente, você pode usar o logger PSR-3 standalone fornecido com o componente console.

Quando muito log aconteceu, é complicado imprimir informações dependendo das definições de verbosidade (-v, -vv, -vvv) porque as chamadas devem ser envoltas em condições. O código rapidamente torna-se verboso ou poluído. Por exemplo:

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('Some info');
    }

    if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
        $output->writeln('Some more info');
    }
}

Em vez de utilizar esses métodos semânticos para testar cada um dos níveis de verbosidade , o `` MonologBridge`_ fornece um ConsoleHandler que ouve eventos do console e escreve mensagens de log para a saída do console, dependendo do nível de atual de log e da verbosidade do console.

O exemplo acima poderia então ser reescrito assim:

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

protected function execute(InputInterface $input, OutputInterface $output)
{
    // assuming the Command extends ContainerAwareCommand...
    $logger = $this->getContainer()->get('logger');
    $logger->debug('Some info');

    $logger->notice('Some more info');
}

Dependendo do nível de verbosidade que o comando é executado e da configuração do usuário (ver abaixo), essas mensagens podem ou não ser exibidas no console. Se elas são exibidas, elas são marcadas com data/hora e coloridas de forma adequada. Além disso, os logs de erro são escritos na saída de erro (php://stderr). Não há mais necessidade de lidar condicionalmente com as definições de verbosidade.

O handler de console do Monolog está ativado na configuração Monolog. Esse é o padrão também na Edição Standard do Symfony 2.4.

  • YAML
    1
    2
    3
    4
    5
    # app/config/config.yml
    monolog:
        handlers:
            console:
                type: console
    
  • XML
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <!-- 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
    1
    2
    3
    4
    5
    6
    7
    8
    // app/config/config.php
    $container->loadFromExtension('monolog', array(
        'handlers' => array(
            'console' => array(
               'type' => 'console',
            ),
        ),
    ));
    

Com a opção verbosity_levels você pode adaptar o mapeamento entre verbosidade e nível de log. No exemplo apresentado ele também irá mostrar avisos no modo normal de verbosidade (em vez de apenas advertências). Além disso, ele só irá usar mensagens de log do canal personalizado my_channel e ele altera o estilo de exibição através de um formatador personalizado (veja a referência do MonologBundle para mais informações):

  • YAML
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # app/config/config.yml
    monolog:
        handlers:
            console:
                type:   console
                verbosity_levels:
                    VERBOSITY_NORMAL: NOTICE
                channels: my_channel
                formatter: my_formatter
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <!-- 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="my_formatter">
                <monolog:verbosity-level verbosity-normal="NOTICE" />
                <monolog:channel>my_channel</monolog:channel>
            </monolog:handler>
        </monolog:config>
    </container>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    // app/config/config.php
    $container->loadFromExtension('monolog', array(
        'handlers' => array(
            'console' => array(
                'type' => 'console',
                'verbosity_levels' => array(
                    'VERBOSITY_NORMAL' => 'NOTICE',
                ),
                'channels' => 'my_channel',
                'formatter' => 'my_formatter',
            ),
        ),
    ));
    
  • YAML
    1
    2
    3
    4
    5
    6
    # app/config/services.yml
    services:
        my_formatter:
            class: Symfony\Bridge\Monolog\Formatter\ConsoleFormatter
            arguments:
                - "[%%datetime%%] %%start_tag%%%%message%%%%end_tag%% (%%level_name%%) %%context%% %%extra%%\n"
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    <!-- 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="my_formatter" class="Symfony\Bridge\Monolog\Formatter\ConsoleFormatter">
                <argument>[%%datetime%%] %%start_tag%%%%message%%%%end_tag%% (%%level_name%%) %%context%% %%extra%%\n</argument>
            </service>
         </services>
    
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    // app/config/services.php
    $container
        ->register('my_formatter', 'Symfony\Bridge\Monolog\Formatter\ConsoleFormatter')
        ->addArgument('[%%datetime%%] %%start_tag%%%%message%%%%end_tag%% (%%level_name%%) %%context%% %%extra%%\n')
    ;