概述 快速入门 教程 手册 最佳实践 组件 参考 贡献

发布于 2015-08-27 16:50:37 | 177 次阅读 | 评论: 0 | 来源: 网络整理

It is possible to use the console to print messages for certain verbosity levels using the OutputInterface instance that is passed when a command gets executed.

参见

Alternatively, you can use the standalone PSR-3 logger provided with the console component.

When a lot of logging has to happen, it’s cumbersome to print information depending on the verbosity settings (-v, -vv, -vvv) because the calls need to be wrapped in conditions. The code quickly gets verbose or dirty. For example:

use SymfonyComponentConsoleInputInputInterface;
use SymfonyComponentConsoleOutputOutputInterface;

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

Instead of using these semantic methods to test for each of the verbosity levels, the MonologBridge provides a ConsoleHandler that listens to console events and writes log messages to the console output depending on the current log level and the console verbosity.

The example above could then be rewritten as:

use SymfonyComponentConsoleInputInputInterface;
use SymfonyComponentConsoleOutputOutputInterface;

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

Depending on the verbosity level that the command is run in and the user’s configuration (see below), these messages may or may not be displayed to the console. If they are displayed, they are timestamped and colored appropriately. Additionally, error logs are written to the error output (php://stderr). There is no need to conditionally handle the verbosity settings anymore.

The Monolog console handler is enabled in the Monolog configuration. This is the default in Symfony Standard Edition 2.4 too.

  • 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',
            ),
        ),
    ));
    

With the verbosity_levels option you can adapt the mapping between verbosity and log level. In the given example it will also show notices in normal verbosity mode (instead of warnings only). Additionally, it will only use messages logged with the custom my_channel channel and it changes the display style via a custom formatter (see the MonologBundle reference for more information):

  • YAML
    # app/config/config.yml
    monolog:
        handlers:
            console:
                type:   console
                verbosity_levels:
                    VERBOSITY_NORMAL: NOTICE
                channels: my_channel
                formatter: my_formatter
    
  • 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="my_formatter">
                <monolog:verbosity-level verbosity-normal="NOTICE" />
                <monolog:channel>my_channel</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' => 'my_channel',
                'formatter' => 'my_formatter',
            ),
        ),
    ));
    
  • YAML
    # app/config/services.yml
    services:
        my_formatter:
            class: SymfonyBridgeMonologFormatterConsoleFormatter
            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="my_formatter" class="SymfonyBridgeMonologFormatterConsoleFormatter">
                <argument>[%%datetime%%] %%start_tag%%%%message%%%%end_tag%% (%%level_name%%) %%context%% %%extra%%n</argument>
            </service>
         </services>
    
    </container>
    
  • PHP
    // app/config/services.php
    $container
        ->register('my_formatter', 'SymfonyBridgeMonologFormatterConsoleFormatter')
        ->addArgument('[%%datetime%%] %%start_tag%%%%message%%%%end_tag%% (%%level_name%%) %%context%% %%extra%%n')
    ;
    
最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务