Symfony 2 log命令输出

时间:2017-01-18 20:49:00

标签: symfony

是否可以将控制台命令的输出记录到日志文件中? 例如,当命令具有:

protected function execute(InputInterface $input, OutputInterface $output)
{
    ...
    $output->writeln('command run');
    ...
}

如何在不修改执行方法的情况下记录输出?

2 个答案:

答案 0 :(得分:1)

根据Symfony2文档:

控制台组件无法提供开箱即用的任何日志记录功能。通常,您手动运行控制台命令并观察输出,这就是未提供日志记录的原因。

http://symfony.com/doc/2.8/console/logging.html

但是,您可以在命令中使用服务容器:

$logger = $this->getContainer()->get('logger');

记录一些事件:

$logger->info('Hello: '.$variable);

您应该在app / logs / dev.log或app / logs / prod.log中看到记录的条目。

答案 1 :(得分:0)

这是我在控制台命令中使用记录器服务的方法。

首先我为记录器配置通道和处理程序,它在config.yml上配置 我的自定义渠道命名为 con ,处理程序命名为 conlog ,但您可以输入所需的名称:

# app/config/config.yml

monolog:
    channels: ['con']
    handlers:
        conlog:
            type:  rotating_file
            max_files: 31
            path:  %kernel.logs_dir%/command.log
            level: debug
            channels: ['con']

我使用rotating_file 类型,因为我的控制台命令全天都是由计划任务执行的 我需要每天跟踪命令,但你可以使用你需要的类型。有关docs

中处理程序类型的更多信息

现在您可以在控制台命令中使用记录器,这里重要的是使用自动注册的记录器服务注入monolog服务,并使用频道名称,在我的示例中它是:

monolog.logger.con

有关docs

的更多信息
// src/AcmeBundle/Command/YourCommand

class YourCommand extends ContainerAwareCommand
{
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $logger = $this->getContainer()->get('monolog.logger.con');
        $myMessage = 'The first message';
        $output->writeln($myMessage);
        $logger->info($myMessage);
    }
}

这就是全部,在此示例中,日志保存在日志目录中,文件名为:command-Y-m-d.log

最后重要的是, con 频道记录器消息也会添加到dev.log。如果您想要阻止它,则需要在main处理程序,config_dev.yml上配置频道选项,并在!前缀我们的自定义频道名称:

# app/config/config_dev.yml

monolog:
    handlers:
        main:
            type:  stream
            path:  %kernel.logs_dir%/%kernel.environment%.log
            level: debug
            channels: ['!con']