是否可以将控制台命令的输出记录到日志文件中? 例如,当命令具有:
时protected function execute(InputInterface $input, OutputInterface $output)
{
...
$output->writeln('command run');
...
}
如何在不修改执行方法的情况下记录输出?
答案 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']