配置Monolog显示命令行信息

3.4 版本
维护中的版本

利用命令行来输出特定 verbosity levels(冗长级别)的信息是可行的,这要用到 OutputInterface 实例,该接口在命令被执行时传入。

可选地,你可以使用Console组件所提供的 独立的PSR-3 logger

当大量日志同时发生,基于冗长设定 (-v, -vv, -vvv) 来输出信息会变得繁琐,因为相关调用需要按条件来封装。代码迅速膨胀或混乱,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
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');
    }
}

不使用这些语义化的方法来设置每种冗长级别, MonologBridge 提供了一个 ConsoleHandler,可以监听命令行事件(console events),并基于当前的日志级别以及命令行的冗长级别将日志信息写入到命令行的output。

上例可以被改写成:

1
2
3
4
5
6
7
8
9
10
11
12
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
 
protected function execute(InputInterface $input, OutputInterface $output)
{
    // assuming the Command extends ContainerAwareCommand...
    // 假设此命令继承自ContainerAwareCommand...
    $logger = $this->getContainer()->get('logger');
    $logger->debug('Some info');
 
    $logger->notice('Some more info');
}

根据命令行所执行的冗长级别(verbosity level)以及用户配置(见下文),这些信息可能会或者不会显示在控制台中,它们被打上了时间戳并施以对应的彩色样式。此外,错误日志会被写入error output(php://stderr)。按条件来处理冗长设定将不再有必要。

Monolog的console handler(命令行控制器)可以在Monolog的配置信息中进行开启。

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

借助 verbosity_levels 选项,你可以适配“verbosity级别与log级别”之间的映射关系。以下给定的例子将在normal级别的verbosity mode (而不是仅在warning级别) 中显示通知(notices)。另外,它只会使用记录在 my_channel 频道的信息,并通过自定义的formatter (参考 MonologBundle reference 以了解更多) 来改变显示样式:

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
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>
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',
        ),
    ),
));
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"
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>
1
2
3
4
5
6
7
// app/config/services.php
use Symfony\Bridge\Monolog\Formatter\ConsoleFormatter;
 
$container
    ->register('my_formatter', ConsoleFormatter::class)
    ->addArgument('[%%datetime%%] %%start_tag%%%%message%%%%end_tag%% (%%level_name%%) %%context%% %%extra%%\n')
;

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)